Java Concurrent
线程的基本概念
线程是系统不同的执行路径
这是一条执行路径
每一个分支都是一个线程,之前写的程序都是一个分支
进程 一个程序就是一个进程 将代码放入代码区,称为进程
操作系统调度程序
线程是一个动态的概念:在进程内的多条执行路径
机器中实际运行的都是线程
机器可以同时执行多个线程,Windows 支持多线程,也支持多进程(DOS 是单进程)
实际上是 CPU 轮转执行多个线程,速度较快,所以可以看做 CPU 同时执行多个线程
但在某一个时间点上,CPU 只能执行一个线程
如果是多个 CPU,可以真正执行多线程
注意 CPU 分的时间片不是一定平均的,可能这个线程时间多一点,另一个线程时间少一点。
一个进程的线程共享内存单元(进程独享内存),这是就会产生冲突,并发问题。
本质区别是每个进程拥有自己的一整套变量,而线程则共享数据
怎样创建一个新的线程呢?
Thread 类
先创建,后启动
一种方法是:
1. new 一个线程 (继承自 Thread 类)就是创建了一个新的线程
2. 重写的 run 方法里面的代码就是这个线程所要执行的内容
3. start 方法使线程开始执行
线程的创建和启动
写法 1:Runnable 接口
1. 自定义一个线程,实现 Runnable 接口的 run 方法
run 方法就是要执行的内容,会在另一个分支上进行
Thread 类本身也实现了 Runnable 接口
2. 主方法中 new 一个自定义线程对象,然后 new 一个 Thread 类对象,其构造方法的参
数是自定义线程对象
(该对象实现了 run 方法,Thread 也实现了 run 方法,所以这是方法的重写)
参数类型是 Runnable 接口,也接受其子类(自定义的线程对象)
(父类引用指向子类对象 有多态的过程)
3. 执行 Thread 类的 start 方法,线程开始执行
自此产生了分支,一个分支会执行 run 方法,在主方法中不会等待 run 方法调用完毕返
回才继续执行,而是直接继续执行,是第二个分支。这两个分支并行运行
输出时会执行一会一个分支,再执行一会另一个分支(与 Cpu 的工作方式一致)
如果不 new 一个线程 Thread 对象调用 start 方法,而直接调用自定义线程的 run 方法
那么只是方法调用,仍为单线程,而不是多线程并行执行
①自定义一个类 MyThread,实现 Runnable 接口的 run 方法 implements Runnable
②在 main 方法中 new 一个自定义类 new MyThread mt
③在 main 方法中 new 一个 Thread 类,其构造方法参数是自定义类的对象,然后调用 start
方法(会自动调用 run 方法)
写在一行就是 Thread t = new Thread(new MyThread ()).start();
示例:
public class test {
public static void main(String []args){
Runner r = new Runner();
Thread t = new Thread(r);
t.start();
for(int i = 0; i <100;i++){
System.out.println("Main " +i);
}
}
}
class Runner implements Runnable {
public void run (){