• Java 创建多线程


    目录

    1.方式一:

    2.方式二:

    3.两种方式的区别:

    4.两种方式的相同点:

    5.方式三:

    6.方式四:

    Java里创建多线程的方式有四种,分别如下所示:

    1.方式一:

    (1)创建一个子类继承Thread

    (2)重写里面的run方法

    (3)实例化子类对象

    (4)调用start方法,用于启动线程,运行重写的run方法

    1. package MultiThreads;
    2. //分别创建两个线程,用于输出奇数和偶数
    3. public class demo2 {
    4. public static void main(String[] args) {
    5. myThread1 t1=new myThread1();
    6. myThread2 t2=new myThread2();
    7. t1.start();
    8. t2.start();
    9. }
    10. }
    11. class myThread1 extends Thread{
    12. @Override
    13. public void run() {
    14. for (int i = 1; i < 100; i++) {
    15. if(i%2==0) System.out.println("*****"+i+"*******");
    16. }
    17. }
    18. }
    19. class myThread2 extends Thread{
    20. @Override
    21. public void run() {
    22. for (int i = 1; i < 100; i++) {
    23. if(i%2!=0){
    24. System.out.println(i);
    25. }
    26. }
    27. }
    28. }

    2.方式二:

    (1)创建一个实现类实现接口Runnable,

    (2)重写run方法

    (3)创建实现类对象

    (4)创建Thread对象,带参构造,参数为上述实现类对象

    (5)调用start方法

    1. package MultiThreads;
    2. public class demo4 {
    3. public static void main(String[] args) {
    4. mythread4 mt=new mythread4();
    5. Thread t= new Thread(mt);
    6. t.start();
    7. }
    8. }
    9. class mythread4 implements Runnable{
    10. @Override
    11. public void run() {
    12. for (int i = 0; i < 100; i++) {
    13. if(i==3||i==6){
    14. System.out.println("pww");
    15. }
    16. }
    17. }
    18. }

    3.两种方式的区别:

    开发中优先选择第二种,实现Runnable接口的方式。

    (1)实现的方式没有类的单继承性的局限性

    (2)实现的方式更适合处理多个线程有共享数据的情况

    4.两种方式的相同点:

    都需要重写run方法,将线程 需要执行的代码放在run中

    5.方式三:

    (1)创建Callable接口的实现类

    (2)重写call方法

    (3)创建实现类对象

    (4)借用FutureTask实现类对象作为参数去创建Thread线程

    (5)调用start方法运行线程

    1. package MultiThreads;
    2. import java.util.concurrent.Callable;
    3. import java.util.concurrent.ExecutionException;
    4. import java.util.concurrent.FutureTask;
    5. public class demo11 {
    6. public static void main(String[] args) {
    7. NumThread nt=new NumThread();
    8. FutureTask ft=new FutureTask(nt);
    9. Thread t=new Thread(ft);
    10. t.start();
    11. for (int i = 0; i < 50; i++) {
    12. System.out.println("*****************************");
    13. }
    14. try {
    15. Object sum=ft.get();
    16. System.out.println("总和为:"+sum);
    17. } catch (InterruptedException e) {
    18. throw new RuntimeException(e);
    19. } catch (ExecutionException e) {
    20. throw new RuntimeException(e);
    21. }
    22. }
    23. }
    24. class NumThread implements Callable{
    25. @Override
    26. public Object call() throws Exception {
    27. int sum=0;
    28. for (int i = 1; i < 100; i++) {
    29. if(i%2==0){
    30. System.out.println(i);
    31. sum+=i;
    32. }
    33. }
    34. return sum;
    35. }
    36. }

    6.方式四:

    使用线程池创建

    (1)提供指定线程数的线程

    (2)提供指定线程的任务

    (3)关闭连接池

    1. package MultiThreads;
    2. import java.util.concurrent.ExecutorService;
    3. import java.util.concurrent.Executors;
    4. public class demo12 {
    5. public static void main(String[] args) {
    6. //提供指定线程的线程池
    7. ExecutorService Service = Executors.newFixedThreadPool(10);
    8. //执行指定线程的任务
    9. Service.execute(new my_thread());
    10. Service.execute(new my_thread2());//适用于Runnable
    11. //Service.submit(Callable callable);适用于Callable
    12. Service.shutdown();//关闭连接池
    13. }
    14. }
    15. class my_thread implements Runnable{
    16. @Override
    17. public void run() {
    18. for (int i = 1; i < 100; i++) {
    19. if(i%2==0){
    20. System.out.println(Thread.currentThread().getName()+" "+i);
    21. }
    22. }
    23. }
    24. }
    25. class my_thread2 implements Runnable{
    26. @Override
    27. public void run() {
    28. for (int i = 1; i < 100; i++) {
    29. if(i%2!=0){
    30. System.out.println(Thread.currentThread().getName()+" "+i);
    31. }
    32. }
    33. }
    34. }

  • 相关阅读:
    Module加载的详细说明-保证你有所收获
    Linux命令之文件管理
    Python Web APP在宝塔发布
    【数据结构笔记04】数据结构之栈的顺序表示和实现(顺序栈)
    【HTML-CSS】总结-6种实现元素 上下左右居中 方法--附演示效果
    Linux各目录的作用
    HashMap源码验证,在JDK8中新增红黑树详解
    2022世界机器人大会开幕,有屋智能主动终止IPO,《2022人工智能发展白皮书》发布,2022可穿戴设备出货量将达3.44亿台
    【LeetCode】Day137-寻找消失&重复数
    ES6 入门教程 10 对象的扩展 10.6 对象的扩展运算符
  • 原文地址:https://blog.csdn.net/wangcheng_BI/article/details/127631631