• 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. }

  • 相关阅读:
    zookeeper节点数据类型介绍及集群搭建
    使用js对象简单模拟虚拟dom的渲染
    ASP.NET网络版进销存管理系统源码【源码免费分享】
    CSS 两栏布局
    一文带你迅速掌握python装饰器
    探索数据结构:双向链表的灵活优势
    基于FPGA的去雾算法
    Java Web 7 JavaScript 7.4 JavaScript 常用对象
    技术的“核心引擎”
    Post-GWAS: LDSC 的 Partitioned Heritability 分析
  • 原文地址:https://blog.csdn.net/wangcheng_BI/article/details/127631631