第二种方式:编程
Class MyThread implements Runnable{并发
Public void run(){spa
Runnable target=new MyThread();操作系统
Thread t3=new Thread(target);线程
Thread.start();//启动线程继承
}接口
}队列
P384:经过接口实现继承进程
练习:写两个线程:ci
① 输入200个“###”②输入200个“***”
下面为线程中的7中很是重要的状态:(有的书上也只有认为前五种状态:而将“锁池”和“等待队列”都当作是“阻塞”状态的特殊状况:这种认识也是正确的,可是将“锁池”和“等待队列”单独分离出来有利于对程序的理解)
① ⑴
② ⑵
③ ⑶ run()结束
Start()
OS分配CPU
CPU时间片结束
yield() o.wait()
等待锁标记
notify()
注意:图中标记依次为
①输入完毕;②wake up③t1退出
⑴如等待输入(输入设备进行处理,而CUP不处理),则放入阻塞,直到输入完毕。
⑵线程休眠sleep()
⑶t1.join()指中止main(),而后在某段时间内将t1加入运行队列,直到t1退出,main()才结束。
特别注意:①②③与⑴⑵⑶是一一对应的。
进程的休眠:Thread sleep(1000);//括号中以毫秒为单位
当main()运行完毕,即便在结束时时间片尚未用完,CPU也放弃此时间片,继续运行其余程序。
Try{Thread.sleep(1000);}
Catch(Exception e){e.printStackTrace(e);}
T1.join()表示运行线程放弃执行权,进入阻塞状态。
当t1结束时,main()能够从新进入运行状态。
T1.join其实是把并发的线程编程并行运行。
线程的优先级:1-10,越大优先级越高,优先级越高被OS选中的可能性就越大。(不建议使用,由于不一样操做系统的优先级并不相同,使得程序不具有跨平台性,这种优先级只是粗略地划分)。
注:程序的跨平台性:除了可以运行,还必须保证运行的结果。
一个使用yield()就立刻交出执行权,回到可运行状态,等待OS的再次调用。