关于用for循环创建新线程的问题

Gugia桑 2014-04-13 09:47:22
    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了,求解决方法
...全文
1048 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheng_e_1990 2014-04-14
  • 打赏
  • 举报
回复
线程创建后并不是立即运行run方法的, for循环在主线程中跑,run方法跑的是另外一个线程,创建完线程后,i在持续增加。 可以自定义一个线程实现,将port作为实例变量保存在每个线程实例中
木鱼121 2014-04-14
  • 打赏
  • 举报
回复
引用 8 楼 Gugia 的回复:
[quote=引用 7 楼 lixiaohua886 的回复:] 在多线程中,你调用start方法后,并不是按照你For循环的顺序执行的,当执行完10000超时时候,下次可能执行后面的任意一个多线程;
有没有更好的方法解决这个问题呢,谢谢[/quote] 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(); Thread.currentThread().sleep(100); } }
木鱼121 2014-04-14
  • 打赏
  • 举报
回复
引用 3 楼 Gugia 的回复:
[quote=引用 1 楼 gxlstone 的回复:] 能否描述的再详细些,或者你一步一步调试看看
其实就是用for循环建立5个新线程,每个新线程创建一个tcp连接,当第一个线程的tcp超时以后,for循环的自加数i直接变为上限值。就是这样。[/quote] 这里你可以这样使用,设置线程优先级: public void dosomething(){ for(i=0;i<5;i++){ Thread t = 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(); } } }); t.setPriority(10-i); t.start(); } }
Gugia桑 2014-04-14
  • 打赏
  • 举报
回复
引用 7 楼 lixiaohua886 的回复:
在多线程中,你调用start方法后,并不是按照你For循环的顺序执行的,当执行完10000超时时候,下次可能执行后面的任意一个多线程;
有没有更好的方法解决这个问题呢,谢谢
木鱼121 2014-04-14
  • 打赏
  • 举报
回复
引用 3 楼 Gugia 的回复:
[quote=引用 1 楼 gxlstone 的回复:] 能否描述的再详细些,或者你一步一步调试看看
其实就是用for循环建立5个新线程,每个新线程创建一个tcp连接,当第一个线程的tcp超时以后,for循环的自加数i直接变为上限值。就是这样。[/quote] 在多线程中,你调用start方法后,并不是按照你For循环的顺序执行的,当执行完10000超时时候,下次可能执行后面的任意一个多线程;
bing_lang 2014-04-14
  • 打赏
  • 举报
回复
引用 3 楼 Gugia 的回复:
[quote=引用 1 楼 gxlstone 的回复:] 能否描述的再详细些,或者你一步一步调试看看
其实就是用for循环建立5个新线程,每个新线程创建一个tcp连接,当第一个线程的tcp超时以后,for循环的自加数i直接变为上限值。就是这样。[/quote] 你把每个i都打印出来,看看有没有你说的跳值现象
kevinlifeng 2014-04-14
  • 打赏
  • 举报
回复
其实,你没有弄清楚线程的运行机制,当你开启了一个线程意识就是执行了start()方法,那么这个线程不一定马上就得到执行知道吗?这个是看操作系统的cpu去调用那个,这些线程是教给操作系统去调度的。打个比方吧~~皇帝就是cpu,皇帝的亲信帮了找来了几个妃子(线程),这些妃子都打扮好了,就等待着皇帝宠幸了,可以这几个妃子,皇帝才不怪那个妃子先进来先呢?他看中那个就宠幸谁先,这个是皇帝决定的,不是你妃子能决定的。你妃子只要打扮好就行了,其他的由其他人决定,不知道你理解了没有。希望对你有帮助。至于线程间的顺序执行,这个就是线程的互斥。看你怎么控制让第一个线程先执行,第二个线程先执行。
cheng_e_1990 2014-04-14
  • 打赏
  • 举报
回复

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();
        }
    }
}
不知道这样能不能达到你的要求
Gugia桑 2014-04-14
  • 打赏
  • 举报
回复
引用 11 楼 cheng_e_1990 的回复:
线程创建后并不是立即运行run方法的, for循环在主线程中跑,run方法跑的是另外一个线程,创建完线程后,i在持续增加。 可以自定义一个线程实现,将port作为实例变量保存在每个线程实例中
您的意思是for循环不要写在主程序里面,而是新建一个线程先来把实例建好,然后再开线程进行tcp连接,我理解的对吗
Gugia桑 2014-04-14
  • 打赏
  • 举报
回复
引用 10 楼 lixiaohua886 的回复:
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(); Thread.currentThread().sleep(100); } }
设置sleep不算是真正解决这个问题的方法,我试过了
淳垚焱 2014-04-13
  • 打赏
  • 举报
回复
我昨天才学的线程 新手路过
Gugia桑 2014-04-13
  • 打赏
  • 举报
回复
引用 1 楼 gxlstone 的回复:
能否描述的再详细些,或者你一步一步调试看看
其实就是用for循环建立5个新线程,每个新线程创建一个tcp连接,当第一个线程的tcp超时以后,for循环的自加数i直接变为上限值。就是这样。
Gugia桑 2014-04-13
  • 打赏
  • 举报
回复
补充:
int[] portarr={10000,10001,10002,10003,10004};
望各位大神解惑
bing_lang 2014-04-13
  • 打赏
  • 举报
回复
能否描述的再详细些,或者你一步一步调试看看

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧