1、使用Executor
Java SE5的java.util.concurrent保重的执行器(Executor)将为你管理Thread对象,从而简化了并发编程。Executor允许你管理异步任务的执行,而无需显示管理线程的生命周期。Executor在Java SE5/6/7中是启动任务的优选方法。
class LifeTest implements Runnable
{
@Override
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class MultiThreadTest
{
public static void main(String[] args) throws InterruptedException
{
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new LifeTest());
exec.shutdown();
}
}
对shutdown方法的调用可以防止新任务被提交给这个Executor。调用shutdown()之后,在shutdown()被调用之前提交的所有任务将继续执行。
2、创建有返回值的线程
Runnable是执行工作的独立任务,但是它不返回任何值。如果你希望任务在完成时可以返回一个值,那么可以实现Callable接口。
class ReturnTest implements Callable<String>
{
@Override
public String call() throws Exception {
return "the_returned_value";
}
}
public class ReturnValueThreadTest
{
public static void main(String[] args) throws InterruptedException, ExecutionException
{
ExecutorService exec = Executors.newCachedThreadPool();
Future<String> retValue = exec.submit(new ReturnTest());
System.out.println(retValue.get());
}
}
对Future<T>.get()的调用将会阻塞,直到结果准备就绪。你还可以调用get(long timeout, TimeUnit unit)来设定超时时间。