【java基础知识】并发

  • 要执行的任务runnable、驱动任务执行的线程thread。thread自身不执行任何操作,只是驱动赋予它的任务。

new Thread(new Task()).start()

Executor执行器管理线程,允许管理异步任务的执行,无须显式管理线程的生命周期,其有多种类型。

Executors.newCachedThreadPool();为每个任务创建一个线程,每个任务分配一次线程开销

Executors.newFixedThreadPool(num);预先一次性进行线程分配,一次线程分配开销

Executors.newSinleThreadExecutor();序列化提交的任务,线程数为1

public class Liftoff implements Runnable {

 @Override  public void run() { 

for (int i = 0; i < 3; i++) {    

  System.out.println("hello " + i);    

Thread.yield();  

 }  }

}

public class TestParallel {
 public static void main(String[] args) {
  ExecutorService executor = Executors.newCachedThreadPool( );//替换不同Executor结果不同
  for (int i = 0; i < 2; i++) {
   executor.execute(new Liftoff());
   String threadName = Thread.currentThread().getName();
   System.out.println("Hello " + threadName);
  }
  executor.shutdown();
 }
}

  • 不同执行器结果展示

SingleThreadExecutor:main 0  main 1 2 0 1 2

FixedThreadPool:0 main 1 2 main 0 1 2 

CachedThreadPool:main 0 1 2 main 0 1 2

  • 任务产生方式:

runnable无返回值,对应run()

Callable允许返回值和异常,对应call()

  • 优先级

常用优先级类型:MAX_PRIORITY 、MIN_PRIORITY 、 NORM_PRIORITY

  • yield和sleep

yield向线程调度器暗示工作已完成差不多,可以让其他线程使用CPU了,也是在建议具有相同优先级的其他线程可以运行

  • 后台线程daemon

指程序运行时后台提供的一种通用服务的线程,这种线程不属于程序中不可或缺的部分。非后台线程结束时,程序也就终止,同时杀死进程中所有后台进程。

在线程启动之前调用setDaemon()才能把他设置为后台线程

原文地址:https://www.cnblogs.com/wygyxrssxz/p/4537082.html