ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程创建的三种方法

2022-05-28 18:31:07  阅读:140  来源: 互联网

标签:线程 Thread 创建 start 三种 FutureTask new public


线程创建的三种方法

 

1.第一种

  1. package com.yang.thread;
    /*
     [1] 继承Thread类,重写run方法
     [2] 使用start() 开启子线程
     [3] 我们调用start(),底层调用的是start0(),底层不是java书写的--->run().
    */
    //线程实现的第一种方式
    public class Thread01 {
       public static void main(String[] args) {

           ThreadTest threadTest = new ThreadTest();
           threadTest.setName("兔子");//给线程设置名字
           threadTest.start();//开启线程

           ThreadTest threadTest1 = new ThreadTest();
           threadTest1.setName("乌龟");
           threadTest1.start();

      }
    }

    class ThreadTest extends Thread{//继承线程
       @Override
       public void run() {//重写run方法
           for (int i = 1; i <=100 ; i++) {
               System.out.println(Thread.currentThread().getName()+i+"m");
          }
      }
    }
package com.yang.thread;

public class Thread02 {
   public static void main(String[] args) {
       //匿名内部类
       Thread thread = new Thread(){
           @Override
           public void run() {
               for (int i = 1; i <=100 ; i++) {
                   System.out.println(Thread.currentThread().getName()+i+"m");
              }
          }
      };
       thread.setName("兔子");
       thread.start();

  }
}

2.第二种

package com.yang.thread;
//创建线程的第二种方法
/*
  实现Runnable接口,重写run方法。
  直接调用start()不可以开启线程。需要使用Thread有参构造进行开启线程。
*/
public class Thread03 {
   public static void main(String[] args) {
       //创建两个对象,和创建一个对象的区别在于资源是否共享。
       MyThread my = new MyThread();
       MyThread my1 = new MyThread();


       Thread t = new Thread(my,"兔子");
       Thread t1 = new Thread(my1,"乌龟");
       t.start();
       t1.start();

       try {
           Thread.sleep(1000);
      } catch (InterruptedException e) {
           e.printStackTrace();
      }
       /*
       有三个线程,一个主线程main,还有两个子线程,,他们都是同时运行的。只是有主线程运行的快,所以先输出完。
        */
       System.out.println("我在输出语句了");

  }
}
class MyThread implements Runnable{

   @Override
   public void run() {
       for (int i = 1; i <=100 ; i++) {
           System.out.println(Thread.currentThread().getName()+i+"m");
      }
  }
}
package com.yang.thread;

public class Thread04 {
   public static void main(String[] args) {
       //使用匿名内部类
       new Thread(new Runnable() {
           @Override
           public void run() {
               //代码块
          }
      }, "线程A").start();

        //使用lambda表达式 ()->{} 相当于重写了runnable中的run()方法。
       new Thread(()->{

      },"线程B").start();

  }
}

3.第三种

package com.yang.thread;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

//实现线程的第三种方式
//实现Callable
/*
可以有返回值
*/
//底层原理
//start() --> start0()-->run()->FutureTask 中的run()方法中调的是-->result = c.call()-->set(result)
// -->outcome = v返回值-->get()得到返回值。
public class Demo05 {
   public static void main(String[] args) throws ExecutionException, InterruptedException {

       MyCallable my = new MyCallable();
       MyCallable my1 = new MyCallable();//这个一般写两个;主要看资源是不是共享

// FutureTask(Callable<V> callable)--->FutureTask<V> implements RunnableFuture<V>--->RunnableFuture<V> extends Runnable
       //相等于一个中间转换FutureTask
       //这是开启了两个线程
       FutureTask<Integer> task = new FutureTask<>(my);
       FutureTask<Integer> task1 = new FutureTask<>(my1);

       Thread thread = new Thread(task,"兔子");
       Thread thread1 = new Thread(task,"兔子");
       thread.start();
       thread1.start();
       //获得当前线程结束后的返回值。thread.start();不能写在这之后,理解一下。
       Integer integer = task.get();
       Integer integer1 = task1.get();
       System.out.println(integer);
       System.out.println(integer1);


  }
}

class MyCallable implements Callable<Integer> {

   @Override
   public Integer call() throws Exception {
       int i = new Random().nextInt(10);
       System.out.println(Thread.currentThread().getName()+i+"m");
       return i;
  }
}
package com.yang.thread;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Demo06 {
   public static void main(String[] args) throws ExecutionException, InterruptedException {

       FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
           @Override
           public Integer call() throws Exception {
               int i = new Random().nextInt(10);
               System.out.println(Thread.currentThread().getName()+i+"m");
               return i;
          }
      });
       new Thread(futureTask,"兔子").start();
       System.out.println(futureTask.get());

  }
}

总结

  • 后两种方式可以避免Java中的单继承的局限性

  • 需要返回值只能使用想实现Callable接口

  • 不需要返回值推荐使用Runnable接口

  • 线程池只能使用Runnable或者Callable类型参数,不能使用Thread类。

标签:线程,Thread,创建,start,三种,FutureTask,new,public
来源: https://www.cnblogs.com/yzlworld/p/16321550.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有