Java自学之路-Java基础教程-35:Java的多线程类Runnable和主线程子线程
2018-03-19 16:10
519 查看
Java的多线程类可以用继承Thread类创建,还可以实现接口Runnable创建。上一节使用匿名类创建线程,这里也使用匿名类实现Runnable接口。
public static void main(String[] args) {
// TODO Auto-generated method stub
new Runnable() {
@Override
public void run() {
System.out.println("Play music!");
}
}.run();
new Runnable() {
@Override
public void run() {
System.out.println("Buy on Taobao!");
}
}.start();
new Runnable() {
@Override
public void run() {
System.out.println("Down load movies!");
}
}.start();
}
注意,在Runnable(){}类体中实现了run()方法,也是使用@Override进行重写,并在后面调用了start()方法去把方法执行了。这种使用Runnable接口和匿名类创建线程的方式很常见。
在main()方法中可以调用这些创建的线程对象,其实main()方法本身在使用一个线程,叫做主线程。Thread.currentThread().getName()可以获取到当前线程的名称,在main()方法中打印后显示主线程的名称为main。
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName());
}相对于main()方法的主线程来说,其他线程称为子线程。调用Thread.sleep(1000)方法可以让主线程休眠1000毫秒,也就是休眠1秒。如果要实现每隔1000毫秒打印一句话,就可以用while循环和.sleep()方法来实现。
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
int i = 1;
while (i <= 10) { Thread.sleep(1000); System.out.println(i); i++; } }
上面的例子在主线程中休眠1秒,再打印数字,就像一个计时器一样执行程序。这个sleep()方法会抛出线程中断异常InterruptedException,所以需要处理,要么继续向外抛出处理,要么用try{}和catch(){}进行捕捉处理。
看下面的程序,就可以看出两个子线程分别在独立于main的主线程在工作。
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Thread childThread1 = new Thread() {
@Override
public void run() {
int i = 1;
while (i <= 10) { try { sleep(1000); System.out.println(Thread.currentThread().getName() + " run:" + i); } catch (InterruptedException e) { e.printStackTrace(); } i++; } } }; Thread childThread2 = new Thread() { @Override public void run() { int i = 1; while (i <= 10) { try { sleep(1000); System.out.println(Thread.currentThread().getName() + " run:" + i); } catch (InterruptedException e) { e.printStackTrace(); } i++; } } }; childThread1.start(); childThread2.start(); System.out.println(Thread.currentThread().getName()); System.out.println("main finished!"); }
程序执行结果:main
main finished!
Thread-0 run:1
Thread-1 run:1
Thread-0 run:2
Thread-1 run:2
Thread-0 run:3
Thread-1 run:3
Thread-0 run:4
Thread-1 run:4
Thread-0 run:5
Thread-1 run:5
Thread-0 run:6
Thread-1 run:6
Thread-0 run:7
Thread-1 run:7
Thread-0 run:8
Thread-1 run:8
Thread-0 run:9
Thread-1 run:9
Thread-0 run:10
Thread-1 run:10
main()方法在程序中调用了两个线程childThread1.start();和childThread2.start();然后才打印主线程的名称,执行过程中却是先打印了主线程名称main而且打印了主线程结束main finished,然后两个线程就还在各自跑,每隔1秒钟就打印i的值,并且可以看出两个子线程在同步地执行,并不互相干扰。
至此,前面35节已经算是Java初级入门了。Java还有很多关键字和API类库,继续学习可以掌握更多细节的东西。无论看书自学,还是在网上找视频跟着练习,都可以如鱼得水,游刃有余地深入学习Java。
![](http://img-blog.csdn.net/20180320222523833?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTIzOTcxMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
具有OCR和ASR功能,可以识别图片和录音中文字,并有多国语言翻译功能,可以作为便签或笔记,类似微博的图文应用
public static void main(String[] args) {
// TODO Auto-generated method stub
new Runnable() {
@Override
public void run() {
System.out.println("Play music!");
}
}.run();
new Runnable() {
@Override
public void run() {
System.out.println("Buy on Taobao!");
}
}.start();
new Runnable() {
@Override
public void run() {
System.out.println("Down load movies!");
}
}.start();
}
注意,在Runnable(){}类体中实现了run()方法,也是使用@Override进行重写,并在后面调用了start()方法去把方法执行了。这种使用Runnable接口和匿名类创建线程的方式很常见。
在main()方法中可以调用这些创建的线程对象,其实main()方法本身在使用一个线程,叫做主线程。Thread.currentThread().getName()可以获取到当前线程的名称,在main()方法中打印后显示主线程的名称为main。
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName());
}相对于main()方法的主线程来说,其他线程称为子线程。调用Thread.sleep(1000)方法可以让主线程休眠1000毫秒,也就是休眠1秒。如果要实现每隔1000毫秒打印一句话,就可以用while循环和.sleep()方法来实现。
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
int i = 1;
while (i <= 10) { Thread.sleep(1000); System.out.println(i); i++; } }
上面的例子在主线程中休眠1秒,再打印数字,就像一个计时器一样执行程序。这个sleep()方法会抛出线程中断异常InterruptedException,所以需要处理,要么继续向外抛出处理,要么用try{}和catch(){}进行捕捉处理。
看下面的程序,就可以看出两个子线程分别在独立于main的主线程在工作。
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Thread childThread1 = new Thread() {
@Override
public void run() {
int i = 1;
while (i <= 10) { try { sleep(1000); System.out.println(Thread.currentThread().getName() + " run:" + i); } catch (InterruptedException e) { e.printStackTrace(); } i++; } } }; Thread childThread2 = new Thread() { @Override public void run() { int i = 1; while (i <= 10) { try { sleep(1000); System.out.println(Thread.currentThread().getName() + " run:" + i); } catch (InterruptedException e) { e.printStackTrace(); } i++; } } }; childThread1.start(); childThread2.start(); System.out.println(Thread.currentThread().getName()); System.out.println("main finished!"); }
程序执行结果:main
main finished!
Thread-0 run:1
Thread-1 run:1
Thread-0 run:2
Thread-1 run:2
Thread-0 run:3
Thread-1 run:3
Thread-0 run:4
Thread-1 run:4
Thread-0 run:5
Thread-1 run:5
Thread-0 run:6
Thread-1 run:6
Thread-0 run:7
Thread-1 run:7
Thread-0 run:8
Thread-1 run:8
Thread-0 run:9
Thread-1 run:9
Thread-0 run:10
Thread-1 run:10
main()方法在程序中调用了两个线程childThread1.start();和childThread2.start();然后才打印主线程的名称,执行过程中却是先打印了主线程名称main而且打印了主线程结束main finished,然后两个线程就还在各自跑,每隔1秒钟就打印i的值,并且可以看出两个子线程在同步地执行,并不互相干扰。
至此,前面35节已经算是Java初级入门了。Java还有很多关键字和API类库,继续学习可以掌握更多细节的东西。无论看书自学,还是在网上找视频跟着练习,都可以如鱼得水,游刃有余地深入学习Java。
具有OCR和ASR功能,可以识别图片和录音中文字,并有多国语言翻译功能,可以作为便签或笔记,类似微博的图文应用
相关文章推荐
- Java自学之路-Java基础教程-34:Java的多线程类Thread和匿名类
- Java自学之路-Java基础教程-48:Java的反射机制Reflection
- Java自学之路-Java基础教程-11:Java基本语句之1-条件控制语句if和else
- Java自学之路-Java基础教程-21:Java的方法参数以及Eclipse新建工程和类
- Java自学之路-Java基础教程-31:Java读文件操作和类的构造方法
- Java自学之路-Java基础教程-9:Java的变量类型-8种基本类型和3种引用类型
- Java自学之路-Java基础教程-32:Java写文件操作和IO输入输出流
- Java自学之路-Java基础教程-49:Java的垃圾回收机制GC
- Java自学之路-Java基础教程-50:Java的键值类Map及哈希表结构HashMap
- Java自学之路-Java基础教程-10:Java的4种运算符-算数运算符、关系运算符、逻辑运算符、位运算符
- Java自学之路-Java基础教程-22:Java的方法返回值和return关键字
- Java自学之路-Java基础教程-37:Java查询数据表Statement类和增删改查Sql
- Java自学之路-Java基础教程-12:Java基本语句之2-循环控制语句for
- Java自学之路-Java基础教程-33:Java的异常类Exception和throws关键字
- Java自学之路-Java基础教程-13:Java基本语句之3-循环控制语句while和do while
- Java自学之路-Java基础教程-23:Java程序的打包和命令行运行jar包
- Java自学之路-Java基础教程-14:Java基本语句之4-条件判断语句switch和case
- Java自学之路-Java基础教程-24:Java工程结构以及类路径classpath
- Java自学之路-Java基础教程-15:Java的类和对象
- Java自学之路-Java基础教程-25:Java运行环境JRE及开发包JDK