返回信息流实例化多个线程,线程做的事情很简单,从1数到100,每数一次睡1秒。看哪个线程先执行完,先执行完的通知其它线程停止。
谢谢!
我自己写的:
public class FastThread extends Thread{
private static String syncObj = new String();
public FastThread(){
}
public void run(){
for(int i = 0; i < 10; ++i){
try{
Thread.sleep(10);
synchronized(syncObj){
if(syncObj.length()!=0){
return;
}
}
}catch(InterruptedException e){
return;
}
}
synchronized(syncObj){
syncObj = new String(this.getName());
System.out.println(syncObj);
}
}
public static void main(String args[]){
ThreadGroup mgroup = new ThreadGroup("defaultThreadGroup");
for(int i = 0; i < 5;++i){
Thread thread = new Thread(mgroup, new FastThread());
thread.setName("thread"+i);
thread.start();
}
//System.out.println(syncObj);
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #35607同步于 2014/10/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
一个Java多线程的程序,求各位大拿给给各种可实现的方法
xziping
2014/10/26镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
没办法。从不同线程的观察角度出发,可能都认为自己比对方先执行完。甚至可能互相都认为自己比对方后执行完。
楼主搜索一下“相对论”里面的火车和闪电的悖论吧。
再说这个程序:执行下面这个语句的时候:
syncObj = new String(this.getName());
每个线程获得的锁可能是不同的。原因是一个线程修改了syncObj变量的值,但是synchronized语句没有完毕,另一个线程又来synchronize,看到了新的变量。这样的程序达不到“用一个锁来保护一个变量”的作用。所以,多个线程对syncObj的读写是一种data race,这是错误的程序。这种情况下,Java语言里,syncObj这个变量的值会很诡异,后续的读会读到某次写的值,尽管机器不至于冒烟。
如果楼主是想如果一个线程先完了,就通知其他线程停止,那么可以调用其他线程的interrupt()方法,然后每个线程在循环的一开头主动调用Thread.interrupted()检测自己是不是被中断了。
如果喜欢用自己的共享变量而不是那个interrupt标记,建议用volatile变量。Java中所有volatile变量的读写保证sequencial consistency(可以查一查)。
用锁也可以,比volatile效率低一些。但请用一个不会变的对象来充当锁。也就是,如果要改syncObj,请用另外一个不会变的变量存放锁对象,用它来保护syncObj。
嗯,谢谢。
【 在 nuanyangyang 的大作中提到: 】
: 没办法。从不同线程的观察角度出发,可能都认为自己比对方先执行完。甚至可能互相都认为自己比对方后执行完。
: 楼主搜索一下“相对论”里面的火车和闪电的悖论吧。
: 再说这个程序:执行下面这个语句的时候:
: ...................
Answers a boolean indicating whether the current Thread (currentThread()) has a pending interrupt request (true) or not (false). It also has the side-effect of clearing the flag.
interrupted方法的注释中:It also has the side-effect of clearing the flag.
具体指什么你知道吗?
【 在 nuanyangyang 的大作中提到: 】
: 没办法。从不同线程的观察角度出发,可能都认为自己比对方先执行完。甚至可能互相都认为自己比对方后执行完。
: 楼主搜索一下“相对论”里面的火车和闪电的悖论吧。
: 再说这个程序:执行下面这个语句的时候:
: ...................
【 在 xziping 的大作中提到: 】
: Answers a boolean indicating whether the current Thread (currentThread()) has a pending interrupt request (true) or not (false). It also has the side-effect of clearing the flag.
: interrupted方法的注释中:It also has the side-effect of clearing the flag.
: 具体指什么你知道吗?
: ...................
字面上的意思。
side-effect是函数式编程的术语。函数式语言把“函数”理解为“变量到返回值的映射”。任何能够改变状态的操作(除了返回值以外),都是副作用。主要包括内存读写和IO操作。这里,“清除flag”就是副作用。就是说只要你调用interrupted,那么那个flag就清掉了。
神呐,好厉害
【 在 nuanyangyang 的大作中提到: 】
:
: 字面上的意思。
: side-effect是函数式编程的术语。函数式语言把“函数”理解为“变量到返回值的映射”。任何能够改变状态的操作(除了返回值以外),都是副作用。主要包括内存读写和IO操作。这里,“清除flag”就是副作用。就是说只要你调用interrupted,那么那个flag就清掉了。
不过syncObj被锁住的静态变量引用存在赋值修改操作,一般synchronized不要这样做,不然可能会出现意想不到的后果....可以新建另外一个变量,去标记是否到达“数完”状态