gpt4 book ai didi

java - 使用java中的对象类方法从用户线程中断主线程

转载 作者:行者123 更新时间:2023-12-01 18:18:59 25 4
gpt4 key购买 nike

    class A
implements Runnable
{
int time;

A( int time )
{
this.time = time;
}

public void run()
{
for ( int i = 0; i < 3; i++ )
{
System.out.println( Thread.currentThread().getName() );
try
{
Thread.sleep( time );
}
catch ( Exception e )
{
System.out.println( e );
}
;
}
}
}
class Check
{
public static void main( String args[] )
throws Exception, Throwable
{
Thread t = Thread.currentThread();
A a1 = new A( 200, t );
A a2 = new A( 100, t );
A a3 = new A( 500, t );
Thread t1 = new Thread( a1 );
Thread t2 = new Thread( a2 );
Thread t3 = new Thread( a3 );
t1.start();
t2.start();
t3.start();
try
{
Thread.sleep( 5000 );
}
catch ( Exception e )
{
}
;// => i have to interrupt this sleep.
System.out.println( "Main Thread's rest of the code" );
}
}

我想在所有用户线程完成时中断主线程的 sleep 一次。如果主线程在用户线程完成之前唤醒,那么它必须与其他用户线程同时执行。p.s:这可以通过java中的Object类来完成。所以给我一些使用它的建议。

最佳答案

使用 ExecutorService 会简单得多,但假设您需要直接使用线程......

您需要做的就是

t1.join();
t2.join();
t3.join();

等待所有线程完成。

您可以使用 run() 对此进行一些优化

t1.start();
t2.start();
t3.run(); // use the current thread

t1.join();
t2.join();
// only need to join two threads.

if main thread wakes up early then i have to perform main thread's rest of the code simultaneously along with the user threads..

假设你想等待后台线程,但不超过 5 秒(我无法想象你为什么要这样做,但是......)

long end = System.currentTimeMillis() + 5000;
t1.join(Math.max(1, end - System.currentTimeMillis()));
t2.join(Math.max(1, end - System.currentTimeMillis()));
t3.join(Math.max(1, end - System.currentTimeMillis()));

主线程将等待最多 5 秒,如果线程完成则提前完成,但如果没有完成则放弃等待。

要对 ExecutorService 执行类似的操作,您可以这样做

ExecutorService es = Executors.newCachedThreadPool();
es.submit(new A(200));
es.submit(new A(100));
es.submit(new A(500));

es.shutdown();
es.awaitTermination(5, TimeUnit.SECONDS);

关于java - 使用java中的对象类方法从用户线程中断主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28108522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com