java多线程复习笔记
1、进程与线程
进程:是一个正在执行中的程序。
每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。
线程在控制着进程的执行。
一个进程中至少有一个线程。
2、java中实现多线程有两种手段,一种是继承Thread,另一种是实现Runnable接口。
3、继承Thread
创建线程的第一种方式:继承Thread类。
步骤:
1,定义类继承Thread。
2,复写Thread类中的run方法。
目的:将自定义代码存储在run方法。让线程运行。
3,调用线程的start方法,
该方法两个作用:启动线程,调用run方法。
*继承Thread类实现多线程
1 class MyThread extends Thread 2 { 3 private String name; 4 public MyThread(String name) 5 { 6 this.name = name; 7 } 8 public void run() 9 { 10 for(int i=0;i<10;i++) 11 { 12 System.out.println(name + "运行,i" + i); 13 } 14 } 15 } 16 public class ThreadDemo 17 { 18 public static void main(String[] args) 19 { 20 MyThread mt1 = new MyThread("线程A "); 21 MyThread mt2 = new MyThread("线程B "); 22 mt1.start(); 23 mt2.start(); 24 } 25 }
——正确地启动线程要用start()方法,不能用run()直接调用方法
*实现Runnable接口
创建线程的第二种方式:实现Runable接口
步骤:
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法。
将线程要运行的代码存放在该run方法中。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
为什么要将Runnable接口的子类对象传递给Thread的构造函数。
因为,自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。
5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
1 class MyThread implements Runnable 2 { 3 private String name; 4 public MyThread(String name) 5 { 6 this.name = name; 7 } 8 public void run() 9 { 10 for(int i=0;i<10;i++) 11 { 12 System.out.println(name + "运行,i" + i); 13 } 14 } 15 } 16 public class ThreadDemo 17 { 18 public static void main(String[] args) 19 { 20 MyThread my1 = new MyThread("线程A "); 21 MyThread my2 = new MyThread("线程B "); 22 Thread t1 = new Thread(my1); 23 Thread t2 = new Thread(my2) 24 t1.start(); 25 t2.start(); 26 } 27 }
4、同步与死锁
——同步是指多个操作在同一个时间段内只能有一个线程进行,其他进程要等待此线程完成之后才可以继续执行。
——解决资源共享恶同步操作,可以使用同步代码块和同步方法两种方式完成
——同步代码块必须制定一个需要同步的对象,但一般都将当前对象(this)设置成同步对象。
*使用同步代码块解决同步问题
1 class MyThread implements Runnable 2 { 3 private String name; 4 public MyThread(String name) 5 { 6 this.name = name; 7 } 8 public void run() 9 { 10 for(int i=0;i<10;i++) 11 { 12 System.out.println(name + "运行,i" + i); 13 } 14 } 15 } 16 public class ThreadDemo 17 { 18 public static void main(String[] args) 19 { 20 MyThread my1 = new MyThread("线程A "); 21 MyThread my2 = new MyThread("线程B "); 22 Thread t1 = new Thread(my1); 23 Thread t2 = new Thread(my2) 24 t1.start(); 25 t2.start(); 26 } 27 }
——死锁
同步中嵌套同步
5、总结
(1)线程是指程序的运行流程,多线程机制可以同时运行多个程序块,使程序运行效率更高。
(2)run()方法是定义在Thread类中的一种方法,因此把线程的程序代码编写在run()方法内所做的就是覆写的操作。
(3)Runnable接口中声明了抽象的run()的方法,因此必须在实现Runnable接口的类中明确定义run()方法。
(4)在每一个线程创建和消亡之前,均会处于创建、就绪、运行、阻塞、终止状态之一
浙公网安备 33010602011771号