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

关于用for循环创建新线程的问题
    public void dosomething(){
     for(i=0;i<5;i++){
     new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
         try {
Socket socket = new Socket("127.0.0.1",portarr[i]);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
     }
     ).start();
     }
    }

这段代码当第一个port:10000连接超时,之后循环直接跳到port:10004了,求解决方法
------解决方案--------------------

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class MyThread extends Thread
{
    private int port;

    public MyThread(int port)
    {
        this.port = port;
    }

    @Override
    public void run()
    {
        try
        {
            Socket socket = new Socket("127.0.0.1", port);
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}



public class ThreadPool
{
    public void init()
    {
        int[] portarr = {10000, 10001, 10002, 10003, 10004};

        for (int i = 0; i < 5; i++)
        {
            new MyThread(portarr[i]).start();
        }
    }
}


不知道这样能不能达到你的要求
------解决方案--------------------
其实,你没有弄清楚线程的运行机制,当你开启了一个线程意识就是执行了start()方法,那么这个线程不一定马上就得到执行知道吗?这个是看操作系统的cpu去调用那个,这些线程是教给操作系统去调度的。打个比方吧~~皇帝就是cpu,皇帝的亲信帮了找来了几个妃子(线程),这些妃子都打扮好了,就等待着皇帝宠幸了,可以这几个妃子,皇帝才不怪那个妃子先进来先呢?他看中那个就宠幸谁先,这个是皇帝决定的,不是你妃子能决定的。你妃子只要打扮好就行了,其他的由其他人决定,不知道你理解了没有。希望对你有帮助。至于线程间的顺序执行,这个就是线程的互斥。看你怎么控制让第一个线程先执行,第二个线程先执行。