(Java)显示地创建线程
Java显示创建线程的几种方法以及其相关的一些内容。
继承Thread
创建一个继承了Thread的类的对象并调用start()方法即可显示创建一个线程。
如果想以此方法创建一个能满足自己需求的线程,可以写一个继承Thread的类,覆盖run()方法,在run()方法里写自己希望线程实现的功能。下面这个例子将创建一个能在控制台打印haha的线程。
public class Test11 extends Thread{
public static void main(String [] args) throws InterruptedException {
new Test11().start();
}
@Override
public void run(){
System.out.println("haha");
}
}
实现Runnable
还有一种方法是实现Runnable接口。下面的代码实现了和上面代码一样的功能。
package thread;
public class Test12 implements Runnable{
@Override
public void run(){
System.out.println("haha");
}
public static void main(String [] args){
new Thread(new Test12()).start();
}
}
实现Callable
Callable接口和Runnable接口类似,但它可以和实现Future接口的对象结合使用获取线程执行的结果或者出现的异常。在下面的例子中使用了一个FutureTask的类(该类实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable接口和Future接口)的对象来获取线程执行的结果。
public class Test13 implements Callable<String>{
@Override
public String call(){
return "haha";
}
public static void main(String [] args){
FutureTask<String> futureTask = new FutureTask<>(new Test13());
new Thread(futureTask).start();
try {
System.out.println(futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
下面这个例子可以看到主线程里捕获了另一个线程运行时出现的异常。
public class Test14 implements Callable<String> {
@Override
public String call() throws Exception {
throw new Exception();
}
public static void main(String [] args){
FutureTask<String> futureTask = new FutureTask<>(new Test14());
new Thread(futureTask).start();
try {
System.out.println(futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
上面代码的catch块有两个捕获的异常。当调用get()方法但是还未产生结果或者抛出异常时调用方法的线程将会阻塞到此位置,直到运行结束、抛出异常或被其它线程中断。如果被其它线程中断,将会呗第一个InterruptedException异常捕获;如果线程在执行时抛出异常将会被ExecutionException异常捕获。
如果在实现Callable时不返回值,可在钻石符号内用Void。
浙公网安备 33010602011771号