创建线程的三种方式:
1.继承Thread类
package com.picchealth.hmbms.utils.export; /** * Created by zyq on 2020/7/31. */ public class FirstThreadTest extends Thread { //重写run方法,run方法的方法体就是线程的执行体 public void run(){ for (int i = 0; i <100 ; i++) { System.out.println(getName()+" "+i); } } public static void main(String[] args) { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+":"+i); if (i==20){ new FirstThreadTest().start(); new FirstThreadTest().start(); } } } }
运行结果:
main:0 main:1 main:2 main:3 main:4 main:5 main:6 main:7 main:8 main:9 main:10 main:11 main:12 main:13 main:14 main:15 main:16 main:17 main:18 main:19 main:20 main:21 main:22 main:23 main:24 main:25 main:26 main:27 main:28 main:29 main:30 main:31 main:32 main:33 main:34 main:35 main:36 main:37 main:38 main:39 main:40 main:41 main:42 main:43 main:44 main:45 main:46 main:47 main:48 main:49 main:50 main:51 main:52 main:53 main:54 main:55 main:56 main:57 main:58 main:59 Thread-0 0 Thread-0 1 Thread-0 2 Thread-0 3 Thread-0 4 Thread-0 5 Thread-0 6 Thread-0 7 Thread-0 8 main:60 main:61 main:62 main:63 main:64 main:65 main:66 main:67 main:68 Thread-1 0 main:69 main:70 main:71 main:72 main:73 main:74 main:75 main:76 main:77 main:78 main:79 main:80 main:81 main:82 main:83 main:84 main:85 main:86 main:87 main:88 main:89 main:90 main:91 main:92 main:93 main:94 main:95 main:96 main:97 main:98 main:99 Thread-0 9 Thread-0 10 Thread-0 11 Thread-0 12 Thread-0 13 Thread-0 14 Thread-0 15 Thread-0 16 Thread-0 17 Thread-0 18 Thread-0 19 Thread-0 20 Thread-1 1 Thread-0 21 Thread-0 22 Thread-0 23 Thread-1 2 Thread-1 3 Thread-1 4 Thread-1 5 Thread-1 6 Thread-1 7 Thread-1 8 Thread-1 9 Thread-1 10 Thread-1 11 Thread-1 12 Thread-1 13 Thread-1 14 Thread-1 15 Thread-1 16 Thread-1 17 Thread-1 18 Thread-1 19 Thread-1 20 Thread-1 21 Thread-0 24 Thread-0 25 Thread-0 26 Thread-0 27 Thread-0 28 Thread-0 29 Thread-0 30 Thread-0 31 Thread-0 32 Thread-0 33 Thread-0 34 Thread-0 35 Thread-0 36 Thread-0 37 Thread-0 38 Thread-1 22 Thread-1 23 Thread-1 24 Thread-1 25 Thread-1 26 Thread-1 27 Thread-1 28 Thread-1 29 Thread-1 30 Thread-1 31 Thread-1 32 Thread-1 33 Thread-1 34 Thread-1 35 Thread-1 36 Thread-1 37 Thread-1 38 Thread-1 39 Thread-1 40 Thread-1 41 Thread-1 42 Thread-1 43 Thread-1 44 Thread-1 45 Thread-1 46 Thread-1 47 Thread-1 48 Thread-1 49 Thread-1 50 Thread-1 51 Thread-1 52 Thread-1 53 Thread-1 54 Thread-1 55 Thread-1 56 Thread-1 57 Thread-1 58 Thread-1 59 Thread-1 60 Thread-1 61 Thread-1 62 Thread-1 63 Thread-1 64 Thread-1 65 Thread-1 66 Thread-1 67 Thread-1 68 Thread-1 69 Thread-1 70 Thread-1 71 Thread-1 72 Thread-1 73 Thread-1 74 Thread-1 75 Thread-1 76 Thread-1 77 Thread-1 78 Thread-1 79 Thread-1 80 Thread-1 81 Thread-1 82 Thread-1 83 Thread-1 84 Thread-1 85 Thread-1 86 Thread-1 87 Thread-1 88 Thread-1 89 Thread-1 90 Thread-0 39 Thread-0 40 Thread-0 41 Thread-1 91 Thread-1 92 Thread-1 93 Thread-1 94 Thread-1 95 Thread-1 96 Thread-1 97 Thread-1 98 Thread-1 99 Thread-0 42 Thread-0 43 Thread-0 44 Thread-0 45 Thread-0 46 Thread-0 47 Thread-0 48 Thread-0 49 Thread-0 50 Thread-0 51 Thread-0 52 Thread-0 53 Thread-0 54 Thread-0 55 Thread-0 56 Thread-0 57 Thread-0 58 Thread-0 59 Thread-0 60 Thread-0 61 Thread-0 62 Thread-0 63 Thread-0 64 Thread-0 65 Thread-0 66 Thread-0 67 Thread-0 68 Thread-0 69 Thread-0 70 Thread-0 71 Thread-0 72 Thread-0 73 Thread-0 74 Thread-0 75 Thread-0 76 Thread-0 77 Thread-0 78 Thread-0 79 Thread-0 80 Thread-0 81 Thread-0 82 Thread-0 83 Thread-0 84 Thread-0 85 Thread-0 86 Thread-0 87 Thread-0 88 Thread-0 89 Thread-0 90 Thread-0 91 Thread-0 92 Thread-0 93 Thread-0 94 Thread-0 95 Thread-0 96 Thread-0 97 Thread-0 98 Thread-0 99
|
2.通过runnable接口创建线程类
package com.picchealth.hmbms.utils.export; /** * Created by zyq on 2020/7/31. */ public class RunableThreadTest implements Runnable { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName()+" "i); } } public static void main(String[] args) { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+" "+i); if(i==20){ RunableThreadTest runableThreadTest=new RunableThreadTest(); new Thread(runableThreadTest,"新线程1").start(); new Thread(runableThreadTest,"新线程2").start(); } } } }
运行结果:
D:\SoftWare\jdk\bin\java "-javaagent:D:\SoftWare\idea\IntelliJ IDEA 2017.1.1\lib\idea_rt.jar=60748:D:\SoftWare\idea\IntelliJ IDEA 2017.1.1\bin" -classpath C:\Users\ZhaoYongqiang\AppData\Local\Temp\classpath538.jar -Dfile.encoding=UTF-8 com.picchealth.hmbms.utils.export.RunableThreadTest main 0 main 1 main 2 main 3 main 4 main 5 main 6 main 7 main 8 main 9 main 10 main 11 main 12 main 13 main 14 main 15 main 16 main 17 main 18 main 19 main 20 main 21 main 22 main 23 main 24 新线程1 0 新线程1 1 新线程2 0 新线程2 1 新线程2 2 main 25 main 26 新线程2 3 新线程1 2 新线程1 3 新线程1 4 新线程1 5 新线程1 6 新线程1 7 新线程1 8 新线程1 9 新线程1 10 新线程1 11 新线程1 12 新线程1 13 新线程1 14 新线程1 15 新线程1 16 新线程1 17 新线程1 18 新线程1 19 新线程1 20 新线程1 21 新线程1 22 新线程2 4 新线程2 5 新线程2 6 main 27 新线程2 7 新线程2 8 新线程2 9 新线程2 10 新线程2 11 新线程2 12 新线程2 13 新线程2 14 新线程2 15 新线程2 16 新线程2 17 新线程2 18 新线程2 19 新线程2 20 新线程1 23 新线程1 24 新线程1 25 新线程1 26 新线程1 27 新线程1 28 新线程1 29 新线程1 30 新线程1 31 新线程1 32 新线程1 33 新线程1 34 新线程1 35 新线程1 36 新线程1 37 新线程1 38 新线程1 39 新线程1 40 新线程1 41 新线程1 42 新线程1 43 新线程1 44 新线程1 45 新线程1 46 新线程2 21 新线程2 22 新线程2 23 新线程2 24 新线程2 25 新线程2 26 新线程2 27 新线程2 28 新线程2 29 新线程2 30 新线程2 31 新线程2 32 新线程2 33 新线程2 34 新线程2 35 新线程2 36 新线程2 37 main 28 main 29 main 30 main 31 main 32 main 33 新线程2 38 新线程2 39 新线程2 40 新线程2 41 新线程2 42 新线程2 43 新线程1 47 新线程1 48 新线程2 44 新线程2 45 新线程2 46 新线程2 47 新线程2 48 新线程2 49 新线程2 50 新线程2 51 新线程2 52 新线程2 53 新线程2 54 新线程2 55 新线程2 56 新线程2 57 新线程2 58 新线程2 59 新线程2 60 新线程2 61 新线程2 62 main 34 新线程2 63 新线程2 64 新线程2 65 新线程2 66 新线程2 67 新线程2 68 新线程2 69 新线程2 70 新线程2 71 新线程2 72 新线程2 73 新线程2 74 新线程1 49 新线程2 75 main 35 main 36 main 37 main 38 main 39 main 40 main 41 main 42 main 43 main 44 main 45 main 46 main 47 main 48 main 49 main 50 main 51 main 52 main 53 main 54 main 55 main 56 main 57 main 58 main 59 main 60 main 61 main 62 main 63 main 64 main 65 新线程2 76 新线程2 77 新线程2 78 新线程2 79 新线程2 80 新线程2 81 新线程2 82 新线程2 83 新线程2 84 新线程2 85 新线程2 86 新线程2 87 新线程2 88 新线程2 89 新线程1 50 新线程1 51 新线程1 52 新线程1 53 新线程1 54 新线程1 55 新线程1 56 新线程1 57 新线程1 58 新线程1 59 新线程1 60 新线程1 61 新线程1 62 新线程1 63 新线程1 64 新线程1 65 新线程1 66 新线程2 90 新线程2 91 新线程2 92 新线程2 93 新线程2 94 新线程2 95 新线程2 96 新线程2 97 新线程2 98 新线程2 99 main 66 新线程1 67 新线程1 68 新线程1 69 新线程1 70 新线程1 71 新线程1 72 新线程1 73 新线程1 74 新线程1 75 新线程1 76 新线程1 77 新线程1 78 新线程1 79 新线程1 80 新线程1 81 新线程1 82 新线程1 83 新线程1 84 新线程1 85 新线程1 86 新线程1 87 新线程1 88 新线程1 89 新线程1 90 新线程1 91 新线程1 92 新线程1 93 新线程1 94 新线程1 95 新线程1 96 新线程1 97 新线程1 98 新线程1 99 main 67 main 68 main 69 main 70 main 71 main 72 main 73 main 74 main 75 main 76 main 77 main 78 main 79 main 80 main 81 main 82 main 83 main 84 main 85 main 86 main 87 main 88 main 89 main 90 main 91 main 92 main 93 main 94 main 95 main 96 main 97 main 98 main 99 Process finished with exit code 0
3.使用CallableThread的方式创建线程
package com.picchealth.hmbms.utils.export; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * Created by zyq on 2020/7/31. */ public class CallableThreadTest implements Callable<Integer>{ @Override public Integer call() throws Exception { int i=0; for (; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+" "+i); } return i; } public static void main(String[] args) { CallableThreadTest ctt=new CallableThreadTest(); FutureTask<Integer> ft=new FutureTask<Integer>(ctt); for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+" 的循环变量i的值是"+i); if(i==20){ new Thread(ft,"有返回值的线程").start(); } } try{ System.out.println("子线程的返回值:"+ft.get()); }catch (InterruptedException e){ e.printStackTrace(); }catch (ExecutionException e){ e.printStackTrace(); } } }
程序的运行结果:
D:\SoftWare\jdk\bin\java "-javaagent:D:\SoftWare\idea\IntelliJ IDEA 2017.1.1\lib\idea_rt.jar=56662:D:\SoftWare\idea\IntelliJ IDEA 2017.1.1\bin" -classpath C:\Users\ZhaoYongqiang\AppData\Local\Temp\classpath.jar -Dfile.encoding=UTF-8 com.picchealth.hmbms.utils.export.CallableThreadTest main 的循环变量i的值是0 main 的循环变量i的值是1 main 的循环变量i的值是2 main 的循环变量i的值是3 main 的循环变量i的值是4 main 的循环变量i的值是5 main 的循环变量i的值是6 main 的循环变量i的值是7 main 的循环变量i的值是8 main 的循环变量i的值是9 main 的循环变量i的值是10 main 的循环变量i的值是11 main 的循环变量i的值是12 main 的循环变量i的值是13 main 的循环变量i的值是14 main 的循环变量i的值是15 main 的循环变量i的值是16 main 的循环变量i的值是17 main 的循环变量i的值是18 main 的循环变量i的值是19 main 的循环变量i的值是20 main 的循环变量i的值是21 main 的循环变量i的值是22 main 的循环变量i的值是23 main 的循环变量i的值是24 main 的循环变量i的值是25 main 的循环变量i的值是26 main 的循环变量i的值是27 有返回值的线程 0 有返回值的线程 1 有返回值的线程 2 main 的循环变量i的值是28 main 的循环变量i的值是29 有返回值的线程 3 有返回值的线程 4 有返回值的线程 5 有返回值的线程 6 有返回值的线程 7 有返回值的线程 8 有返回值的线程 9 有返回值的线程 10 main 的循环变量i的值是30 main 的循环变量i的值是31 main 的循环变量i的值是32 main 的循环变量i的值是33 main 的循环变量i的值是34 main 的循环变量i的值是35 main 的循环变量i的值是36 main 的循环变量i的值是37 有返回值的线程 11 有返回值的线程 12 有返回值的线程 13 有返回值的线程 14 有返回值的线程 15 有返回值的线程 16 有返回值的线程 17 有返回值的线程 18 有返回值的线程 19 有返回值的线程 20 main 的循环变量i的值是38 main 的循环变量i的值是39 main 的循环变量i的值是40 main 的循环变量i的值是41 main 的循环变量i的值是42 main 的循环变量i的值是43 有返回值的线程 21 有返回值的线程 22 有返回值的线程 23 有返回值的线程 24 有返回值的线程 25 有返回值的线程 26 有返回值的线程 27 有返回值的线程 28 有返回值的线程 29 有返回值的线程 30 有返回值的线程 31 有返回值的线程 32 有返回值的线程 33 有返回值的线程 34 有返回值的线程 35 有返回值的线程 36 有返回值的线程 37 有返回值的线程 38 有返回值的线程 39 有返回值的线程 40 有返回值的线程 41 有返回值的线程 42 有返回值的线程 43 有返回值的线程 44 有返回值的线程 45 有返回值的线程 46 有返回值的线程 47 有返回值的线程 48 有返回值的线程 49 有返回值的线程 50 有返回值的线程 51 有返回值的线程 52 有返回值的线程 53 有返回值的线程 54 有返回值的线程 55 有返回值的线程 56 有返回值的线程 57 有返回值的线程 58 有返回值的线程 59 有返回值的线程 60 有返回值的线程 61 有返回值的线程 62 有返回值的线程 63 有返回值的线程 64 有返回值的线程 65 有返回值的线程 66 有返回值的线程 67 有返回值的线程 68 有返回值的线程 69 有返回值的线程 70 有返回值的线程 71 有返回值的线程 72 有返回值的线程 73 有返回值的线程 74 有返回值的线程 75 main 的循环变量i的值是44 有返回值的线程 76 有返回值的线程 77 有返回值的线程 78 有返回值的线程 79 有返回值的线程 80 main 的循环变量i的值是45 main 的循环变量i的值是46 main 的循环变量i的值是47 main 的循环变量i的值是48 main 的循环变量i的值是49 main 的循环变量i的值是50 main 的循环变量i的值是51 main 的循环变量i的值是52 main 的循环变量i的值是53 main 的循环变量i的值是54 有返回值的线程 81 main 的循环变量i的值是55 main 的循环变量i的值是56 main 的循环变量i的值是57 main 的循环变量i的值是58 main 的循环变量i的值是59 main 的循环变量i的值是60 main 的循环变量i的值是61 main 的循环变量i的值是62 main 的循环变量i的值是63 main 的循环变量i的值是64 main 的循环变量i的值是65 main 的循环变量i的值是66 main 的循环变量i的值是67 main 的循环变量i的值是68 main 的循环变量i的值是69 main 的循环变量i的值是70 main 的循环变量i的值是71 main 的循环变量i的值是72 main 的循环变量i的值是73 main 的循环变量i的值是74 main 的循环变量i的值是75 main 的循环变量i的值是76 main 的循环变量i的值是77 main 的循环变量i的值是78 main 的循环变量i的值是79 main 的循环变量i的值是80 main 的循环变量i的值是81 main 的循环变量i的值是82 main 的循环变量i的值是83 main 的循环变量i的值是84 main 的循环变量i的值是85 main 的循环变量i的值是86 main 的循环变量i的值是87 main 的循环变量i的值是88 有返回值的线程 82 main 的循环变量i的值是89 main 的循环变量i的值是90 main 的循环变量i的值是91 main 的循环变量i的值是92 main 的循环变量i的值是93 main 的循环变量i的值是94 main 的循环变量i的值是95 main 的循环变量i的值是96 main 的循环变量i的值是97 main 的循环变量i的值是98 main 的循环变量i的值是99 有返回值的线程 83 有返回值的线程 84 有返回值的线程 85 有返回值的线程 86 有返回值的线程 87 有返回值的线程 88 有返回值的线程 89 有返回值的线程 90 有返回值的线程 91 有返回值的线程 92 有返回值的线程 93 有返回值的线程 94 有返回值的线程 95 有返回值的线程 96 有返回值的线程 97 有返回值的线程 98 有返回值的线程 99 子线程的返回值:100 Process finished with exit code 0
关于在什么情况下使用多线程:一般情况是发送短信或者生成批单的时候,这种在主流程中比较耗费时间的步骤中,我们会使用的比比较多,在其他情况下,不推荐使用多线程。