关于线程的 一些概念
线程
线程与callback
线程池
线程间通信
主题:对于java线程的一点点牢骚
长久以来一直对java多线程api有些疑惑,java主张“万事万物皆对象”
可是在计算机编程中偏偏有些东西很不适合表达成对象形式,“线程”就是其中之一
这也是为什么面向对象并不可能完全取代面向过程的原因,我对于java多线程感觉到不爽的原因主要是:
一、一个线程本应该是一个进程的全局属性,一旦创建一个线程就应该是全局注册的
但是在java里,这个变成了手工操作,很多时候一个线程在想与其他线程通讯的时候经常拿不到那个线程的引用
这就导致了为了完成本该多个线程协同完成的一个任务,各个参与的线程引用之间来回的传递,确保能够通讯
而一个理想的线程创建方式,我喜欢这样:
二、线程间通讯其实不是通讯而是一线程修改另一线程变量
一个理想的线程通讯应该有发送、接收两个动作的,比如这样
三、还对于很多API不是很理解,比如wait/notify,以我理解,阻塞应该是一个线程的全局状态,为什么wait/notify是object的方法,却不是Thread的方法,比如
可是在计算机编程中偏偏有些东西很不适合表达成对象形式,“线程”就是其中之一
这也是为什么面向对象并不可能完全取代面向过程的原因,我对于java多线程感觉到不爽的原因主要是:
一、一个线程本应该是一个进程的全局属性,一旦创建一个线程就应该是全局注册的
但是在java里,这个变成了手工操作,很多时候一个线程在想与其他线程通讯的时候经常拿不到那个线程的引用
这就导致了为了完成本该多个线程协同完成的一个任务,各个参与的线程引用之间来回的传递,确保能够通讯
而一个理想的线程创建方式,我喜欢这样:
- //system全局注册并执行线程
- System.createThread(new Runnable(){
- public void run(){
- .....
- }
- },"Thread1");
- //任何其他线程当需要与Thread1通讯时候都可以
- Runnable a = System.getThreadObject("Thread1");
- a.stop();
二、线程间通讯其实不是通讯而是一线程修改另一线程变量
一个理想的线程通讯应该有发送、接收两个动作的,比如这样
- interface Runnable(){
- public void run();
- //改写Runnable接口,用getValue接收数据
- public void getValue(Object o);
- }
- /system全局注册并执行线程
- System.createThread(new Runnable(){
- public void run(){
- .....
- }
- },"Thread1");
- //给线程发送数据"123"
- System.send("Thread1","123");
三、还对于很多API不是很理解,比如wait/notify,以我理解,阻塞应该是一个线程的全局状态,为什么wait/notify是object的方法,却不是Thread的方法,比如
- //一个线程阻塞,等待满足一定条件之后继续运行
- public void run(){
- ...
- this.wait();
- ...
- }
- //倘若这样写又有什么意义?我就是想知道wait为什么是object而不是Thread的方法
- public void run(){
- ...
- Integer i = new Integer();
- i.wait();
- ...
- }
1、语言和平台设计者没有帮你做这件事情,但是你自己要做这件事情也是很简单的,搞个全局map映射,java并没有约束这一点。
2、调用方法,不就是发送消息?
3、因为每个对象实例都可以用做对象锁,因此wait,notify放在了Object中。
我个人感觉这些问题比较容易理解啊。
1.楼主所说的System类也是一个全局类,既然这样,我可以自己定义一个全局类,里面就放一个同步化的Map来存储 name/id-->Thread的映射关系。
2.既然是特定的需求,那就可以继承runnable接口自己加入需要的东西,借助全局类,也可以做到。
3.synchronized,wait/notify其实就是通过锁机制实现共享变量的访问控制,既然是共享变量,当然是object的类,至于Thread,它也是Object类,thread类也可以wait自己,但是要靠别人来notify它了。
java里面线程阻塞,其实是线程进入持有lock对象的wait set,wait就是当前线程进入wait Set,notify就是让其中一个出来继续run。如果这个线程一直没有出来,就阻塞了。如果是run方法内部导致的阻塞,那就是另外一回事了。