实现线程池的几种方式


进程和线程

说进程之前首先说一下程序,程序是指令和数据的有序集合,本身没有任何运行的含义,是一个静态的概念.

进程就是程序的一次执行过程,是一个动态的概念,是系统分配资源的单位.

而一个进程由若干个线程组成,进程中至少要有一个线程,不然就没有存在的意义,线程是CPU调度和执行的单位.是独立的执行路径

第一种实现:

继承Thread类

package com.lei.thread;

//实现多线程方式一:继承Thread类
public class Thread1 extends Thread{

   //重写run方法,编写线程执行体
   @Override
   public void run() {
       for (int i = 0; i < 1000; i++) {
           System.out.println(Thread.currentThread().getName()+"跟女孩表白");
      }
  }
}

class Test1{
   public static void main(String[] args) {
       //创建线程对象
       Thread1 t1 = new Thread1();
       //调用start方法启动线程
       t1.start();  //Thread-0跟女孩表白
       t1.run();    //main跟女孩表白
  }
}

注意:线程的run()方法是由java虚拟机直接调用的,如果我们没有调用线程的start()方法,而是在应用代码中直接调用run()方法,那么这个线程的run()方法其实运行在当前线程(即run()方法的调用方所在的线程)之中,而不是运行在其自身的线程中,所以不会创建引得线程

如上面代码:在main方法中执行的run()方法不会创建新的线程,而在main方法中执行的start()方法会启动一个新的线程,新的线程再去调用run方法

第二种实现:

实现Runnable接口

package com.lei.thread;

//实现多线程方式二:实现Runnable接口
public class Thread2 implements Runnable{

   //重写run方法,编写线程执行体
   @Override
   public void run() {
       for (int i = 0; i < 1000; i++) {
           System.out.println(Thread.currentThread().getName()+"跟女孩表白");
      }
  }
}

class Test2{
   public static void main(String[] args) {
       //创建runnable接口的实现类对象
       Thread2 t2 = new Thread2();
       //把runnable接口的实现类丢入要执行的线程中,开启start方法
       new Thread(t2).start();
  }
}

第三种实现:

实现Callable接口

Callable接口类似于Runnable,两者都是实现接口,但是Callable的call()方法可以有返回值,并且可以抛出异常。但是Runnable不行。

另外,需要创建一个FutureTask对象用来获取结果以及传递参数给线程对象

package com.lei.thread;

import java.util.concurrent.*;

//实现多线程方式三:实现Callable接口,这里的泛型是返回值的类型
public class Thread3 implements Callable<String> {

   //重写call方法,抛出异常,编写线程执行体,
   @Override
   public String call() throws Exception {
       for (int i = 0; i < 100; i++) {
           System.out.println("跟女孩表白" + i);
      }
       return "答应";
  }

}

class Test3{
   public static void main(String[] args) throws ExecutionException, InterruptedException {
       //线程开启之后需要执行里面的call方法
       Thread3 t3 = new Thread3();
       //可以获取线程执行完毕之后的结果,也可以作为参数传递给Thread对象
       FutureTask<String> futureTask = new FutureTask(t3);
       //创建线程对象
       Thread thread = new Thread(futureTask);
       //开启线程
       thread.start();
       //获取执行结果
       String result = futureTask.get();
       System.out.println(result);
  }
}

第四种实现

线程池方式

package com.lei.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Thread4 implements Runnable{

   @Override
   public void run() {
       System.out.println(Thread.currentThread().getName()+"跟女孩表白");
  }
}

class Test4{
   public static void main(String[] args) {
       //创建线程池,参数为线程池的大小
       ExecutorService executorService = Executors.newFixedThreadPool(6);
       //执行
       executorService.execute(new Thread4());
       executorService.execute(new Thread4());
       executorService.execute(new Thread4());
       executorService.execute(new Thread4());
       //关闭线程池
       executorService.shutdown();
  }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM