读书笔记-Java多线程编程核心技术-01
0 写在前面
之前零散了自学了一些Java多线程方面的知识,明白了一些概念,还是有些凌乱,从读《Java多线程编程核心技术》开始,从头学习多线程相关内容,并做系统的记录。
1 进程、线程与多线程
进程与线程是操作系统里的内容,这里简单的说一下概念,关于并发并行、CPU调度等内容可以阅读操作系统相关书籍。
- 进程:可以看做系统中运行的程序,在Windows资源管理器中“进程”列表,可以具象的看到进程。
- 线程:一个进程可以分成几个线程,线程是进程当中的子单位,线程之间可以共享所属进程的部分资源。
- 多线程:顾名思义就是多个线程并发执行。
注:并行是多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时;并发是通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。
2 使用多线程
在没有使用多线程之前,可能对如何在代码中实现线程很神秘,我自己在最初就因为不了解,对多线程很恐惧,觉得肯定很复杂。其实对多线程的使用与我们对类的使用是一样的,并没有高深莫测,只是线程中一些相关方法需要学习一下。下面就来看一看如何实现多线程:
在Java中,有两种方法来得到线程。一是继承Thread类,二是实现Runnable接口。使用继承Thread类的方式创建新线程时,最大的局限就是不支持多继承。因为Java语言的特点就是单根继承。当需要支持多继承时,就要采用实现Runnable接口的方式。两种实现方法没有本质区别。
2.1 继承Thread类
Thread类结构
1 public class Thread implements Runnable
可以看Thread类实现了Runnable接口。这就更加明确上文所说的,两种实现方式没有本质区别。
我们以一个实例来学习,如果暂时不明白,没有关系,先依样画葫芦敲一遍,我们后面会讲详细内容。
线程类:
1 public class MyThread extends Thread{ 2 @Override 3 public void run(){ 4 super.run(); 5 System.out.println("MyThread"); 6 } 7 }
运行类:
1 public class Main{ 2 public static void main(String[] args){ 3 MyThread myThread=new MyThread(); 4 myThread.start(); 5 System.out.println("运行结束"); 6 } 7 }
执行main方法,运行结果:
运行结束
MyThread
在运行main方法之后,你就已经成功的创建并使用了一个线程。所谓多线程就是对多个Thread对象的使用,这样一来就不会觉得多线程有多神秘了吧。
通过输出结果我们可以看到,MyThread类中的run方法执行时间较晚,这也是说明,在使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序无关的。线程是一个子任务,CPU以不确定的方式来调用线程中的run方法,所以会先打印“运行结束”后打印“MyThread”。其原因其实是,当你调用start方法时,线程并没有正在执行,它正处于就绪状态,线程的调度是由JVM(Java虚拟机)来完成 的。关于线程的几个状态,会在之后说明。所以调用线程start方法的顺序,并不一定是线程运行的顺序。
注:需要明白的是,main方法自己其实也是一个线程。
2.2 实现Runnable接口
如果想要创建线程的线程类,已经有了一个父类,这是就不能再继承自Thread类了,因为Java不支持多继承。因此需要实现Runnable接口来解决这个情况。如何采用实现Runnable接口的方式,我们还是以实例来看:
线程类:
1 public class MyRunnable implements Runnable{ 2 @Override 3 public void run() { 4 System.out.println("MyRunnable"); 5 } 6 }
运行类:
1 public class Main{ 2 public static void main(String[] args){ 3 Runnable runnable=new MyRunnable(); 4 Thread thread=new Thread(runnable); 5 thread.start(); 6 System.out.println("运行结束"); 7 } 8 }
运行结果:
运行结束
MyRunnable
这样我们就成功的用实现Runnable接口的方式来创建线程。这里我们是把Runnable接口的实现类,作为Thread类构造方法的参数,从而创建线程的。学习的时候先会用,有个概念,详细内容以后会讲到。
看完这篇之后,应该对线程有了基本的认识,对Java中如何创建线程也有了了解。下一篇将讲解线程的生命周期,明白线程什么时候创建,什么时候执行,什么时候结束。
-- 无可奈何花落去,似曾相识燕归来。小园香径独徘徊。

浙公网安备 33010602011771号