创建线程的三种方法及其比较

想写博客好久了,养成好习惯,第一篇!微笑

方法一:继承Thread类创建线程类

注意:既然已经继承了Thread,就不能再继承其他类了哈(Java是单继承呢)

         多个线程之间无法共享线程类的实例变量

public class FirstThread extends Thread {
private int i;//这个i是线程类的实例变量,不会被共享呢
public void run() {
for (; i < 100; i++) {
System.out.println(getName() + ":" + i);
}

}

public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
if (i == 20) {
new FirstThread().start();
new FirstThread().start();
}
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}

}

方法二:实现Runnable接口创建线程类

注意:Runnable实现类的run()方法是线程的执行体,注意Runnable对象只是作为Thread对象的target,实际的线程对象仍然是Thread实例。如果两个线程共享同一个target,那么也就共享了该Runnable类的实例变量。

public class SecondThread implements Runnable{
private int i;
public void run() {
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
public static void main(String[] args) {
SecondThread st=new SecondThread();
for (int i = 0; i < 100; i++) {
if (i == 20) {
new Thread(st,"线程1").start();
new Thread(st,"线程2").start();
}
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}

方法三:实现Callable接口创建线程类

扫描二维码关注公众号,回复: 1027910 查看本文章

注意:这种方法和第二种很像,Callable接口提供了一个call()方法作为线程执行体。

和run()方法相比,call()方法有返回值,可以声明抛出异常。

Callable接口的实现类不可以作为Thread对象的target,所以Java 5提供了一个Future接口来代表call()方法的返回值。

FutureTask类既实现了Future接口,又实现了Runnable接口,可以作为Thread对象的target。所以可以通过FutureTask来包装Callable对象。

public class ThirdThread {
public static void main(String[] args) {
FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
int i=0;
public Integer call() throws Exception {
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
return i;
}
});
for (int i = 0; i < 100; i++) {
if (i == 20) {
new Thread(task,"有返回值的线程").start();
}
System.out.println(Thread.currentThread().getName() + ":" + i);
}
        try {
System.out.println("返回值是"+task.get());//调用get方法会导致主线程被阻塞
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
        System.out.println("main线程结束了");
}
}

猜你喜欢

转载自blog.csdn.net/weixin_35110513/article/details/79340089