2 u013348817 u013348817 于 2016.02.03 11:30 提问

java 主函数中启动第二个线程,然后主函数继续向下执行,不关心第二个线程的状态,要怎么写

需求是这样的,请求过来,先将所有的数据存下来,启动第二个线程去处理数据,主函数里面不关心第二个线程是否处理完成,直接返回成功,这样怎么写

5个回答

leilba
leilba   Rxr 2016.02.03 11:38
已采纳

你可以采取这样的操作:

YourData yourData;
     boolean requestDeco(YourData yourData) {
                //存一份
                this.yourData = yourData;
                //交给线程处理
        new SecondThread(yourData).start();
                //返回成功
        return true;
    }

    class SecondThread extends Thread {
        YourData yourData;
        public SecondThread(YourData yourData) {
            this.yourData = yourData;
        }

        @Override
        public void run() {
            //
            // do secondThread
        }
    }
u013348817
u013348817 回复林深: 哦,我知道了,我改一下
接近 2 年之前 回复
leilba
leilba 回复当如王守仁: 调用run()的话不是开启线程,而是调用线程对象里面的run()方法,这个实际是在当前线程调用的,而调用start()的话,系统会开启新的线程,新的线程的入口会默认调用run()方法
接近 2 年之前 回复
leilba
leilba 回复当如王守仁: 注意,开启线程的方法是 .start() ,不是run(),,
接近 2 年之前 回复
u013348817
u013348817 是这样操作的
接近 2 年之前 回复
gary16
gary16   2016.02.03 11:36

你开了线程,本来就不用等它完成了

u013348817
u013348817 可是主函数里面就是等了的
接近 2 年之前 回复
u013348817
u013348817   2016.02.03 11:38

没有啊,我试了一下,让线程sleep 10秒,主函数就等了10秒才返回的啊

u013348817
u013348817   2016.02.03 11:42

map.put("batchList", batchList);
msgServiceMapper.batchSave(map); //先保存数据库
SendMsgThread send = new SendMsgThread(batchMessage, supplierModel);
send.run();
ResponseStatus responseStatus = ResponseStatus.Success;
msgServiceMapper.updateSendStatus(responseStatus.toString(), reqId);

    return responseStatus;
leilba
leilba send.start(),,看我上面写的
接近 2 年之前 回复
fk002008
fk002008   2016.02.03 12:46

你的主函数怎么写的贴出来看看

线程开启之后和原来的函数所在的线程就是并行的.
如果你的问题是主函数等待那么可能是你把sleep加到主函数的线程上面去了

你看如下代码

    public static void main(String[] args) {

        System.out.println(test2());

    }


    public static String test2() {
        new Thread() {
            public void run() {
                System.out.println("thread1");
            }
        }.start();

        new Thread() {
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("thread2");
            }
        }.start();
        System.out.println("end");
        return "OK";
    }
    ```
执行结果是
thread1
end
OK
//几秒过后输出
thread2


u013348817
u013348817 谢了,已经解决了这个问题,
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!