多线程问题 多线程threadjava 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 join()不是这么用的.我这里有个例子供你参考class Sleeper extends Thread{ private int duration; public Sleeper(String name,int sleepTime){ super(name); duration=sleepTime; start(); } public void run(){ try{ for(int i=0;i<50;i++){ System.out.println(i); } sleep(duration); }catch(InterruptedException e){ System.out.println(getName() + "was interrupted" + "is Interrupted" + isInterrupted()); return; } System.out.println(getName()+ "has awakened"); }}class Joiner extends Thread{ private Sleeper sleeper; public Joiner(String name,Sleeper sleeper){ super(name); this.sleeper=sleeper; start(); } public void run(){ try{ sleeper.join(); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(getName()+ "join completed"); }}public class Joining { public static void main(String[] arg){ Sleeper s1= new Sleeper("sleepy",2000), s2=new Sleeper("grumpy",2000); Joiner j1= new Joiner("dopey",s1), j2=new Joiner("doc",s2); }} 1. 结束不结束没什么关系啊。 join本来就是等结束啊。 结果不一样是因为线程并发的问题造成的。 你吧join放在上面的话,等于是没执行一个线程他都要等执行好再下一个,你这个看起来是多线程,其实就是个单线程。2. volatile不能解决这个问题,volatile只保证可见性。 对于i++ ,它不是一个原子操作。 它其实是i = i+1 你要解决并发问题,一个是可以用锁,保证同时就一个人修改。 或者用atomicInteger类,它用CAS操作保证了操作的原子性。 java怎样将gbk编码的文字转为utf-8编码的,转为utf-8的目的是为了在繁体系统下正常显示 如何监视线程的活动状态? 实现了Runnable接口就可以用start方法启动,这句话对嘛? 在几个JTabbedPane中如何设置显示的序号? 我写了一个J2SE的应用程序(main执行),还使用了一个第三方的软件包, 如何加载两个或两个以上的Applet 熟悉VBB数据库结构的进来拿分! 编译通过,运行出错,帮忙看一下? 大侠们,请指教!!! jTable中不同的行显示不同的颜色问题。200分请教,马上结。 一个想不通的问题,求助,在线等 求各位大神解决一下
我这里有个例子供你参考
class Sleeper extends Thread{
private int duration;
public Sleeper(String name,int sleepTime){
super(name);
duration=sleepTime;
start();
}
public void run(){
try{
for(int i=0;i<50;i++){
System.out.println(i);
}
sleep(duration);
}catch(InterruptedException e){
System.out.println(getName() + "was interrupted" + "is Interrupted" + isInterrupted());
return;
}
System.out.println(getName()+ "has awakened");
}
}
class Joiner extends Thread{
private Sleeper sleeper;
public Joiner(String name,Sleeper sleeper){
super(name);
this.sleeper=sleeper;
start();
}
public void run(){
try{
sleeper.join();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(getName()+ "join completed");
}
}
public class Joining {
public static void main(String[] arg){
Sleeper s1= new Sleeper("sleepy",2000),
s2=new Sleeper("grumpy",2000);
Joiner j1= new Joiner("dopey",s1),
j2=new Joiner("doc",s2);
}
}
你吧join放在上面的话,等于是没执行一个线程他都要等执行好再下一个,你这个看起来是多线程,其实就是个单线程。
2. volatile不能解决这个问题,volatile只保证可见性。 对于i++ ,它不是一个原子操作。 它其实是i = i+1
你要解决并发问题,一个是可以用锁,保证同时就一个人修改。 或者用atomicInteger类,它用CAS操作保证了操作的原子性。