其他分享
首页 > 其他分享> > 线程创建的三种方法

线程创建的三种方法

作者:互联网

线程创建的三种方法

 

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());

  }
}

总结

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