育才网站建设,关于未备案网站,网站排名优化电话,今天国内重大新闻事件作者 | 王磊来源 | Java中文社群#xff08;ID#xff1a;javacn666#xff09;转载请联系授权#xff08;微信ID#xff1a;GG_Stone#xff09;声明#xff1a;本故事纯属虚构#xff0c;如果雷同那就是真事了#xff01;大家好#xff0c;我是线程#xff0c;我的… 作者 | 王磊来源 | Java中文社群IDjavacn666转载请联系授权微信IDGG_Stone声明本故事纯属虚构如果雷同那就是真事了大家好我是线程我的英文名叫 Thread别看我现在风光无限好像人尽皆知的样子然而我的身世却悲惨离奇。我出身在一个小山村那是一个与世隔绝的世外桃源然而年纪轻轻的我却展现出了与众不同的性格。比如当身边的同龄人还在沉浸于玩泥巴的喜悦时我就开始思考如何避免下雨天对出行造成的阻碍当身边的同龄人还在沉浸于夕阳下的奔跑时我已经开始思考为什么太阳会东升西落而我们人类又为什么会生存在地球上于此可见一斑。当时的我在所有人眼里就是一个“怪人”村里面的阿猫、阿狗走路都要躲着我。但我的母亲懂我她知道这个小伙子器宇不凡、骨骼惊奇必是练武奇才将来保护宇宙的重任和维护世界和平的重任可能要交付与我这个神童身上了于是在我刚满 3 岁那天母亲就把我过继给了她的一位远房亲戚了。首位母亲继承Thread接下来我要把我的出生过程演示给你看这也是我的第一段人生经历。创建方式一线程最原始的创建方式只需要继承 Thread 类重写 run() 方法即可实现代码如下// 创建方式 1继承 Thread
class MyThread extends Thread {Overridepublic void run() {System.out.println(你好线程~);}
}
// 测试
public class ThreadExample {public static void main(String[] args) {// 创建线程Thread thread new MyThread();// 启动线程thread.start();}
}
变种方法以上创建线程的方式略显繁琐我们也可以使用匿名对象的方式在创建 Thread 类的时候就直接重写 run() 方法实现代码如下// 变种 1匿名方式创建线程
Thread t1 new Thread() {Overridepublic void run() {System.out.println(线程变种);}
};
// 启动线程
t1.start();
继承Thread的缺点Java 语言的设计是单继承所以当继承了 Thread 之后就不能再继承其他类了。也就是说如果我一直呆在亲生母亲extends Thread的身边那么就得不到好的教育所以长大之后也注定会普普通通这可能就是母亲把我过继给远房亲戚的原因吧。第二位母亲实现Runnable在 Java 语言中虽然不能实现多继承但可以实现多接口所以我在第二位母亲家过得也算如鱼得水。创建方式二和继承 Thread 类差不多实现 Runnable 接口也是重写 run() 方法具体实现代码如下public class ThreadExample2 {// 创建方式 2实现 Runnable 接口static class MyThread implements Runnable {Overridepublic void run() {System.out.println(你好线程~);}}// 代码测试public static void main(String[] args) {// 创建 Runnable 子类MyThread myThread new MyThread();// 创建线程Thread thread new Thread(myThread);// 启动线程thread.start();}
}
变种方法1匿名Runnable以上实现 Runnable 的接口有更简单的实现方法我们可以使用匿名 Runnable 来创建一个线程如下代码所示// 变种 1匿名 Runnable 方式
Thread t2 new Thread(new Runnable() {Overridepublic void run() {System.out.println(我是线程变种方法~);}
});
// 启动线程
t2.start();
变种方法2Lambda创建Runnable在 JDK 8 之后我们可以使用 Lambda 表达式来操作代码了所以对于创建匿名 Runnable 类我们也有了更简单的实现方法如下代码所示// 变种 2使用 Lambda 匿名 Runnable 方式
Thread t3 new Thread(() - {System.out.println(我是变种 2~);
});
// 启动线程
t3.start();
注意以上实现代码只支持 JDK 1.8 版本。第三位母亲村里的首富虽然我的前两位母亲对我都很好但对于我这样一个气宇轩扬、骨骼惊奇将来要拯救宇宙和维护世界和平的少年来说只在国内混未免局限性太大所以我一直想去大洋彼岸追寻自己的梦想然而以「前两位」母亲的财力不足以支撑我这样做。然而我的第二个家庭和村里的首富一家是至交得知我的志向之后他们一家愿意倾囊相授举一家之力帮我去大洋彼岸追寻我的梦想。于是在感激之余我的第二位母亲让我当场认下首富一家为我的干爹、干妈。就这样我就有了第三位母亲了。创建方式三前两种创建方式虽然不错但都不能接收线程执行之后的返回值于是在 JDK 1.5 之后就加入了 Callable 和 Futrue用于接收线程执行之后的返回值具体的实现代码如下import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/*** 线程创建示例 3*/
public class CreateThreadExample3 {// 创建方式 3实现 Callable 接口static class MyCallable implements CallableInteger {Overridepublic Integer call() throws Exception {int num new Random().nextInt(10);System.out.println(生成随机数 num);return num;}}// 代码测试public static void main(String[] args) throws ExecutionException, InterruptedException {// 创建 Callable 子对象MyCallable callable new MyCallable();// 使用 FutureTask 配合 Callable 子对象得到执行结果FutureTaskInteger futureTask new FutureTask(callable);// 创建线程Thread thread new Thread(futureTask);// 启动线程thread.start();// 得到线程执行的结果int result futureTask.get();System.out.println(主线程中拿到子线程执行结果 result);}
}
以上代码的执行结果如下从以上结果可以看出使用 Callable 配合 FutrueTask 可以正确拿到线程执行之后的返回值。而我的故事也在这里结束了我最终不负三位母亲所望虽不能拯救宇宙和维护世界和平但却也能在程序界作出自己的一些贡献这就是我和我三位母亲的故事。总结本文使用第一人称“我”Thread的视角讲了线程创建的三种方式第一种是继承 Thread但因为 Java 语言不允许多继承所以当继承了 Thread 之后就不能继承其他类了于是就有了第二种方式实现 Runnable 接口的方式。然而前两种实现虽然可以创建线程但不能接收线程执行之后的返回值于是就有了第三种实现 Callable通过它我们可以取得线程执行之后的返回值。原创不易希望本文的写作方式你们能喜欢。都看到这了点个赞再走吧
往期推荐
Semaphore自白限流器用我就对了CyclicBarrier人齐了老司机就发车了CountDownLatch别浪等人齐再团