日期:2014-05-20  浏览次数:20660 次

Java 多线程问题 求各位大神解答
public class dddd extends Thread
{
static int i=100;
public synchronized void run()
{

System.out.println(Thread.currentThread().getName()+"    "+i);
i--;
}
public static void main(String[] args)
{
int i=100;
dddd h=new dddd();
Thread a=new Thread(h);
Thread b=new Thread(h);
Thread c=new Thread(h);
Thread d=new Thread(h);
Thread e=new Thread(h);
while(dddd.i)
{
a.start();
b.start();
c.start();
d.start();
e.start();
}
}
}

我想建立5个线程 然后有一个计数器 当计数器的数i<1时停止进程 
为什么while循环内只执行一次后就开始报错 

------解决方案--------------------
引用:
Quote: 引用:

Thread的start()方法只能执行一次,你不用那个while循环的,判断要在线程的run()里面写最好
你这个写法while循环里同一个Thread执行了很多次,所以会报错

您这个输出是
Thread-1    100
Thread-1    99
Thread-1    98
Thread-1    97
Thread-1    96
Thread-1    95
Thread-1    94
Thread-1    93
Thread-1    92
Thread-1    91
Thread-1    90
Thread-1    89
Thread-1    88
Thread-1    87
....
知道1
我的意思是类似于窗口售票的程序
就是一次运行一个线程 
等卖出票后 
在运行另一个线程(可能是自己 也可能是别的线程)
然后知道票卖完 
就是这样
窗口1-----100
窗口3-----99
窗口2-----98
窗口1-----97
....
知道票售完 最后就可以停止所有线程

问题解决了一大半,利用的是外层循环,内层一个判断
代码如下:
package test;

class Window implements Runnable {
public void run() {
for(int k = 0;k<99;k++){
synchronized(this)
{
try{
Thread.sleep(100);
}catch(Exception e){}
if(i>=1)
System.out.println(Thread.currentThread().getName() + "    "
+ i--);
}
}
}

private int i = 100;
}

public class Main {
public static void main(String[] args) {
Window h = new Window();
Thread a = new Thread(h, "a");
Thread b = new Thread(h, "b");
Thread c = new Thread(h, "c");
Thread d = new Thread(h, "d");
Thread e = new Thread(h, "e");
Thread f = new Thread(h, "f");
Thread g = new Thread(h, "g");
a.start();
b.start();
c.start();
d.start();
e.start();
f.start();
g.start();
}
}

原理我也说不太懂,外层循环至少要保证和i的个数一样才比较科学……
------解决方案--------------------
引用:
原理我也说不太懂,外层循环至少要保证和i的个数一样才比较科学……

这几天多线程的问题不少,不能语言交流确实不太好教明白别人怎么写多线程,尴尬。
不要在run()里面写synchronized(this),没什么用。