java线程

线程与进程

  • 线程
  1. 进程是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间。
  •  进程
  1. 线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行。一个进程最少有一个线程。
  2. 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。

线程调度

  • 分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
  • 抢占式调度
  1. 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
  2. CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。

同步与异步

  1. 同步:排队执行 , 效率低但是安全。
  2. 异步:同时执行 , 效率高但是数据不安全。

并发与并行

  1. 并发:指两个或多个事件在同一个时间段内发生。
  2. 并行:指两个或多个事件在同一时刻发生(同时发生)。

线程的状态

  1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
  2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
  3. 阻塞(BLOCKED):表示线程阻塞于锁。
  4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
  5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
  6. 终止(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

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程 就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池就是一个容纳多个线程的容器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。

四种线程池:

  1. 缓存线程池 (长度无限制)        ExecutorService service = Executors.newCachedThreadPool();
  2. 定长线程池 (长度是指定的数值)       ExecutorService service = Executors.newFixedThreadPool(2);
  3. 单线程线程池(效果与定长线程池 创建时传入数值1 效果一)ExecutorService service = Executors.newSingleThreadExecutor();
  4. 周期性任务定长线程池       ScheduledExecutorService service = Executors.newScheduledThreadPool(2);

 

 

posted @ 2021-03-28 14:29  进击的小白·  阅读(71)  评论(0)    收藏  举报