一 线程的实现:
多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
MyThread th = new MyThread();//实例化线程对象,既是一条线程
Thread thread1 = new Thread(th);//对线程实现多态>即实现线程同步
1.一条线程因为有对象(方法体)的存在才有意义,所以在创建一条线程时,里面放的对象必须是线程对象才行,其它对象创建不了线程
二 线程的状态:
生:新实例化一条线程对象,线程对象已经创建,还没有在其上调用start()方法。
可运行:线程被启动,当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线 程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
运行中:线程在运行中,线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
等待:线程等待,阻塞,睡眠,锁,这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件 运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。
死:线程对象方法执行完,当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就 不能复生。如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
三 线程使用:
同步:
下面两种方式创建了三个线程,线程同时启动时,出现了两种结果
从表面上看,两种方式都是创建三条相同线程,执行同一个对象,区别就在于创建线程的方式,不同的创建方式决定了线程的,应用域
第一种方式:它是相对于线程而言,以线程为主,对象为辅(复制),结果:三条线程,三个对象
第二种方式:它是相对于对象而言:以对象为主,线程为辅(复制),结果:三条线程,一个对象
1.第一种方式:一个线程对象被创建了三次,创建出三条含有各自对象(且完全相同)的线程,去执行各自的对象
MyThread th = new MyThread();
MyThread th1 = new MyThread();
MyThread th2 = new MyThread();
th.setName("窗口1");
th1.setName("窗口2");
th2.setName("窗口3");
th.start();
th1.start();
th2.start();
2. 第2种方式,创建了一个线程对象,在同一个线程对象的基础上,多态(分裂)出三条线程,同时执行这一个对象
//Test1 t = new Test1();
/*Thread thread1 = new Thread(th);
thread1.setName("窗口1");
thread1.start();
Thread thread2 = new Thread(th);
thread2.setName("窗口2");
thread2.start();
Thread thread3= new Thread(th);
thread3.setName("窗口3");
thread3.start();*/
锁: