java线程
线程与进程
- 线程
- 进程是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间。
- 进程
- 线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行。一个进程最少有一个线程。
- 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。
线程调度
- 分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
- 抢占式调度
- 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
- CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
同步与异步
- 同步:排队执行 , 效率低但是安全。
- 异步:同时执行 , 效率高但是数据不安全。
并发与并行
- 并发:指两个或多个事件在同一个时间段内发生。
- 并行:指两个或多个事件在同一时刻发生(同时发生)。
线程的状态
- 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
- 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
- 阻塞(BLOCKED):表示线程阻塞于锁。
- 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
- 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
- 终止(TERMINATED):表示该线程已经执行完毕。

线程创建的三种方式
- 继承Thread
1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 System.out.println(Thread.currentThread().getName()); 5 } 6 } 7 class demo{ 8 public static void main(String[] args) { 9 Thread t = new MyThread(); 10 t.start(); 11 } 12 }
- 实现Runnable
1 public class MyRunnable implements Runnable{ 2 @Override 3 public void run() { 4 System.out.println(Thread.currentThread().getName()); 5 } 6 } 7 class Demo{ 8 public static void main(String[] args) { 9 //创建任务对象 10 MyRunnable r = new MyRunnable(); 11 //创建线程 12 Thread t = new Thread(r); 13 //启动线程 14 t.start(); 15 new Thread(new Runnable() { 16 @Override 17 public void run() { 18 19 } 20 }).start();27 } 28 }
- 实现Callable
1 public static void main(String[] args) throws ExecutionException, InterruptedException { 2 Callable<Integer> c = new MyCallable(); 3 FutureTask t = new FutureTask(c); 4 new Thread(t).start(); 5 System.out.println(t.get()); 6 } 7 static class MyCallable implements Callable<Integer>{ 8 @Override 9 public Integer call() throws Exception { 10 return 0; 11 } 12 }
线程池 Executors
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程 就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池就是一个容纳多个线程的容器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。
四种线程池:
- 缓存线程池 (长度无限制) ExecutorService service = Executors.newCachedThreadPool();
- 定长线程池 (长度是指定的数值) ExecutorService service = Executors.newFixedThreadPool(2);
- 单线程线程池(效果与定长线程池 创建时传入数值1 效果一)ExecutorService service = Executors.newSingleThreadExecutor();
- 周期性任务定长线程池 ScheduledExecutorService service = Executors.newScheduledThreadPool(2);

浙公网安备 33010602011771号