Java 线程(1)
1.创建
Java种线程的创建方法有三种:
1)继承Thread对象,实现run()方法
1 package thread; 2 3 public class MyThread01 extends Thread { 4 5 private static int i = 10; 6 7 @Override 8 public void run() { 9 while (i > 0) { 10 System.out.println(--i); 11 } 12 } 13 14 public static void main(String[] args) { 15 new MyThread01().start();// 注意用start来启动一个线程 16 new MyThread01().start(); 17 // new MyThread01().run(); 这只是运行了run方法并没有启动线程 18 } 19 }
2)实现Runnable接口,实例化Thread接口
1 package thread; 2 3 public class MyThread02 implements Runnable { 4 // private static int i = 10;// 用一个static 变量来实现对资源的共享 5 6 private int i = 10; 7 8 @Override 9 public void run() { 10 11 while (i > 0) { 12 System.out.println(Thread.currentThread().getName() + "执行" + (--i)); 13 } 14 } 15 16 public static void main(String[] args) { 17 18 // Thread thread1 = new Thread(new MyThread02()); 19 // thread1.setName("T1"); 20 // Thread thread2 = new Thread(new MyThread02()); 21 // thread2.setName("T2"); 22 // thread1.start(); 23 // thread2.start(); 24 25 // 用同一个MyThread02完成资源共享 26 MyThread02 thread02 = new MyThread02(); 27 Thread thread11 = new Thread(thread02); 28 thread11.setName("T1"); 29 Thread thread12 = new Thread(thread02); 30 thread12.setName("T2"); 31 thread11.start(); 32 thread12.start(); 33 34 } 35 36 }
3)应用程序可以使用Executor框架来创建线程池
链接:http://www.cnblogs.com/dolphin0520/p/3932921.html
2.启动
1)start方法
用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。
2)run方法
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。
3.线程的生命周期(可用状态)
1)新建(new)
2)可运行(runnable):对象线程创建后,其他线程如主线程调用了该兑现的start方法。线程位于可运行线程池中,等待被线程调度,获取CPU。
3)运行(running):可运行状态的线程获得了cpu时间片,执行代码。
4.阻塞(block):线程由于某种原因放弃了cpu的还使用权,暂时停止质心,直到线程进入可运行状态,才有机会再次获得cpu timeslice进入运行状态。分三种情况:
1)等待阻塞:运行的线程执行wait()方法,进入等待队列
2)同步阻塞:运行的线程在获取对象的同步锁的时候,若该同步锁被其他线程占用,则JVM会把该线程放入锁池。
3)其他阻塞:执行Thread.sleep()或t.join()时,或者发出了IO请求时,JVM会把线程置为阻塞状态。
5.死亡(dead):run()或main()方法执行结束或者因为异常退出run(),则结束生命周期。