创建线程
Java中创建线程有两种方法:
扩展java.lang.Thread
类
实现java.lang.Runnable
接口
扩展java.lang.Thread类
这个类中有一个run()方法,子类只需要重写该方法即可。
实现java.lang.Runnable接口
实现这个接口的类需要实现run方法,同上
启动线程
在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
在调用start()方法之前:线程处于新状态中,新状态指向一个Thread对象,但还没有一个真正的线程。
在调用start()方法之后:发生了一系列复杂的事情:
启动新的执行线程(具有新的调用栈)
该线程从新状态转移到可运行状态
当该线程获得机会执行时,其目标run()方法将运行
注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。若在main主线程中直接调用run方法,那么将会阻塞主线程,直到run方法执行完毕。
例子
继承Thread类,重写run方法,并调用start方法启动线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Thread2Methods extends Thread { public Thread2Methods(String name) { super(name); } @Override public void run(){ for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()); try { Thread.sleep(i*1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { Thread2Methods thread1 = new Thread2Methods("线程1"); Thread2Methods thread2 = new Thread2Methods("线程2"); thread1.start(); thread2.start(); } }
|
实现Runnable接口,重写run方法,并把这个接口类作为Thread类的构造函数参数创建一个线程,并调用start方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Thread2Methods implements Runnable { @Override public void run(){ for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()); try { Thread.sleep(i*1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { Thread thread1 = new Thread(new Thread2Methods(),"线程1"); Thread thread2 = new Thread(new Thread2Methods(),"线程2"); thread1.start(); thread2.start(); } }
|
输出结果
1 2 3 4 5 6 7 8 9 10
| 线程2 线程1 线程2 线程1 线程1 线程2 线程1 线程2 线程2 线程1
|