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

解决方案 »

  1.   


    我刚开始学多线程 不太熟悉
    public class dddd extends Thread
    {
    static int i=100;
    public synchronized void run()
    {
    while(i>=1)
    {
    System.out.println(Thread.currentThread().getName()+"    "+i);
    i--;
    }
    }
    public static void main(String[] args) throws InterruptedException
    {
    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);
    a.start();
    b.start();
    c.start();
    d.start();
    e.start();

    }
    }这么写也不对啊 能不能帮忙写一下 谢谢
      

  2.   


    我刚开始学多线程 不太熟悉
    public class dddd extends Thread
    {
    static int i=100;
    public synchronized void run()
    {
    while(i>=1)
    {
    System.out.println(Thread.currentThread().getName()+"    "+i);
    i--;
    }
    }
    public static void main(String[] args) throws InterruptedException
    {
    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);
    a.start();
    b.start();
    c.start();
    d.start();
    e.start();

    }
    }这么写也不对啊 能不能帮忙写一下 谢谢我从N小时前到现在正在研究多线程。。用Runnable接口呗,可以更好的实现
    public class dddd implements Runnable
    {
        int i=100;
        public synchronized void run()
        {
            while(i>=1)
            {
             synchronized (this){
              System.out.println(Thread.currentThread().getName()+"    "+i);
                i--;
                }
             }
               
        }
        public static void main(String[] args) throws InterruptedException
        {
            
            dddd h=new dddd();
            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");
            a.start();
            b.start();
            c.start();
            d.start();
            e.start();
             
        }
    }
      

  3.   


    我刚开始学多线程 不太熟悉
    public class dddd extends Thread
    {
    static int i=100;
    public synchronized void run()
    {
    while(i>=1)
    {
    System.out.println(Thread.currentThread().getName()+"    "+i);
    i--;
    }
    }
    public static void main(String[] args) throws InterruptedException
    {
    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);
    a.start();
    b.start();
    c.start();
    d.start();
    e.start();

    }
    }这么写也不对啊 能不能帮忙写一下 谢谢另外因为这个过程相当之快,也就只能有一个线程抢到了CPU,然后就完成了,你可以改成查秒的,就能看出来几个线程的并行情况了另外你原来的竟然线程没有名字……
      

  4.   

    您这个输出是
    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
    ....
    知道票售完 最后就可以停止所有线程
      

  5.   

    您这个输出是
    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
    ....
    知道票售完 最后就可以停止所有线程public void run()如果有synchronized就会发生这种情况
      

  6.   

    您这个输出是
    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的个数一样才比较科学……
      

  7.   

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

  8.   

    这几天多线程的问题不少,不能语言交流确实不太好教明白别人怎么写多线程,尴尬。
    不要在run()里面写synchronized(this),没什么用。没用吗?仅就这个代码来说,如果没有synchronized(this),就会导致跳跃性的输出了啊,中间有值会缺失
      

  9.   

    不好意思没仔细看你的代码,当成实现Thread的代码结构了,这个锁没问题。