3.java多线程: 卖票事例p275
实现多线程代码的两种手段, 一种是继承Thread类, 另一种是实现Runnable接口。
为什么启动多线程时, 必须通过start()方法, 而不是run()方法?
回答: 线程的运行需要本机操作系统支持。
一般重复调用start()方法时会抛出IllegalThreadStateException异常, 而实际上调用的是
start0()方法, start0()方法的声明使用了native关键字, 此关键字表示调用的是本机的操作系统函数,
因为多线程的实现需要依靠底层操作系统的支持。
如果一个类继承了Thread类, 则不适合于多个线程共享资源, 而实现了Runable接口, 就可以方便的实现资源共享。
线程的状态: 创建 new、就绪 start、运行 run、堵塞 (wait、sleep、suspend)、死亡 (destory、stop)。
后台线程: 在java程序中, 只要前台有一个线程运行, 则整个Java进程都不会消失, 所以此时可以设置一个后台进程,
这样即使Java进程结束了, 此后台线程依然会继续执行。 要想实现这样的操作, 直接使用 Threat tt = new Thread(); tt.setDaemon(true);
如果通过实现Runnable接口, 多个线程进行资源共享时, 要使用synchronized关键字进行资源的同步处理, 就会面临 同步 和 死锁:
解决方法: 同步代码块、 同步方法、 等待 或 唤醒
案例(生产者和消费者) p296
强制运行某一线程: 使用join() 方法。