ps:呀呀的网上找不到一张详细点的生命周期状态图,只要自己用pd画了。这图经典没啥好多说的了
得到Running不会一直运行下去,只是得到了时间片,时间一到就回到ready.由图可以看出进入waitting sleeping blocked的thread。如果调用thread的interrupt就可以回到ready
Thread join sleep
自己写的例子演示了通过继承Thread实现线程的方法,join和sleep的使用
Synchronized lock wait blocked notify Runnable 线程优先级
下面的数据类是O'reilly的例子,线程测试自己写
为了避免在多线程的情况下一个对象被同时操作引起错误,引入了Synchronized和
lock的概念。使用Synchronized对对象或方法设置一个对象锁。先进入同步语句的线程得到对象锁,其他想访问的线程进入blocked state.线程处理完后,打开lock这时由其他处于blocked state的线程进行调度。
用下面的例子来说明,并说明如何通过实现接口来实现线程以及线程的优先级
测试结果1:
Thread A pop starting
Thread C pop starting
Thread B push starting
Thread B push ending
Thread A pop starting
Thread C pop starting
Thread B push starting
Thread B push ending
Thread A pop starting
测试结果2
Thread A pop starting
Thread C pop starting
Thread B push starting
Thread A pop starting
Thread B push ending
Thread C pop starting
Thread B push starting
Thread A pop starting
Thread B push ending
测试结果3 去掉TestRunnable的注释
Thread C pop starting
Thread B push starting
Thread C pop starting
Thread B push ending
Thread A pop starting
Thread B push starting
Thread C pop starting
Thread B push ending
Thread A pop starting
线程1 pop list
线程2 push list
数据类
thread_safe ,deadlock
要safe就要synchronized
除了Vector Hashtable其他集合都没有synchronized方法
可以通过
Collections.synchronizedList(list),
Collections.synchronizedMap(map)
进行同步化封装。
deadlock 就是2个对象互相调用互相锁住,线程全部blocked
sleep() 和 wait() 有什么区别?
网络上流行的回答 sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级,(b)正在运行的线程因为其它原因而阻塞。 wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到 |
其实根据线程生命周期来说,进入waiting state,sleeping state后想再运行就必须先进入到ready state,然后根据线程优先级等待进入running.
他们最主要的区别
第一点 wait() notify() notifyAll()都是Ojbect类的方法,每个类都有着方法。
sleep()则是Therad类的方法
第二点。wait()等待时不锁同步对象,这也是它位于Ojbect里面的原因吧。我想。
sleep()等待时锁同步对象。
我写了段代码来证明了
让2个线程操作同一个对象的同步方法。
方法里用分别用sleep和wait进行暂停测试
sleep测试结果 lock
a Run starting 1163206243750
b Run starting 1163206243750
a Run ending 1163206245750
b Run ending 1163206247750
b Run starting 1163206243750
a Run ending 1163206245750
b Run ending 1163206247750
wait测试结果 no lock
a Run starting 1163206314250
b Run starting 1163206314250
a Run ending 1163206316250
b Run ending 1163206316250
b Run starting 1163206314250
a Run ending 1163206316250
b Run ending 1163206316250
启动一个线程是用run()还是start()?
网络上流行的说法 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 |
线程要运行首先是要进入ready state,这正是start()的作用
run()只是线程要运行的内容。
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
网络上流行的说法
|
synchronized给一个对象或方法加了锁后,第一个执行它的线程把锁关掉。其他线程就不能访问了。第一个线程执行完毕打开对象锁。然后由对象的monitor通知其他阻塞的线程来访问。
守护线程和用户线程。
守护线程的设置很简单 setDaemon(true)
2者的区别也很简单。守护线程依赖于创建他的线程,用户线程是独立的
自己写了个简单的例子
有注释的测试结果(User Thread)
strating
1
2
3
4
5
Main Thread Ending
6
7
8
9
1
2
3
4
5
Main Thread Ending
6
7
8
9
(ps:会一直延续下去)
去掉注释的测试结果(daemon)
strating
1
2
3
4
5
Main Thread Ending
6
1
2
3
4
5
Main Thread Ending
6