一、基本概念
1、进程
操作系统进行资源分配的基本单位。
2、线程
一个程序不同执行路径(调度执行的基本单位)
3、程序
可执行的文件
1、单核cup设置 多线程是否有意义
有意义,有些需要等待数据但不需要cup操作的线程,可以先让出来,让其他线程执行,充分利用cpu利用率。
2、工作线程数是不是设置越大越好?
不是,线程切换会消耗资源。
3、工作线程数(线程池中的数量)设多少合适?
二、创建线程的基本方式(5种)
1、实现thread抽象类
2、实现runnable接口
3、使用lambda表达式
4、使用线程池
5、实现callable接口
package com.mashibing.juc.c_000_threadbasic; import java.util.concurrent.*; public class T02_HowToCreateThread { static class MyThread extends Thread { @Override public void run() { System.out.println("Hello MyThread!"); } } static class MyRun implements Runnable { @Override public void run() { System.out.println("Hello MyRun!"); } } static class MyCall implements Callable<String> { @Override public String call() { System.out.println("Hello MyCall"); return "success"; } } //启动线程的5种方式 public static void main(String[] args) throws Exception { new MyThread().start(); new Thread(new MyRun()).start(); new Thread(() -> { System.out.println("Hello Lambda!"); }).start(); FutureTask<String> task = new FutureTask<>(new MyCall()); Thread t = new Thread(task); t.start(); System.out.println(task.get()); ExecutorService service = Executors.newCachedThreadPool(); service.execute(() -> { System.out.println("Hello ThreadPool"); }); Future<String> f = service.submit(new MyCall()); String s = f.get(); System.out.println(s); service.shutdown(); } }
Callable的使用:
FutureTask<String> task = new FutureTask<>(new MyCall()); Thread t = new Thread(task); t.start(); System.out.println(task.get());
Future<String> f = service.submit(new MyCall()); String s = f.get(); System.out.println(s); service.shutdown();