线程
1. 什么是进程?什么是线程?
进程是一个应用程序(一个进程是一个软件),线程是一个进程中的执行场景/执行单元,一个进程可以启动多个线程。
对于Java程序来说,当在DOS命令窗口输入:Java HelloWorld回车换行之后会启动JVM,而JVM就是一个进程。JVM在启动一个主线程调用main方法。同时在启动一个垃圾回收线程负责看护,现在的Java程序中至少有两个线程并发,一个是垃圾回收线程,一个执行main方法的主线程。
2. 进程和线程之间的关系
例:
阿里巴巴:进程
马云:阿里巴巴的一个线程
童文红:阿里巴巴的一个线程
注意:
进程A和进程B的内存独立不共享。(阿里巴巴和京东资源不共享)
线程A和线程B,堆内存和方法区内存共享
但是栈内存独立,一个线程和一个栈。
java中之所以有多线程机制,目的是为了提高程序的处理效率
main方法结束只是主线程结束了,主栈空了,其它的栈可能还在压栈弹栈
3. 堆和方法区共享栈独立
4.多线程并发的理解
4. 实现线程的第一种方式
5.run和start的区别
6. 实现线程的第二种方式
6.1 采用匿名内部类方式实现
7. 线程的生命周期
新建状态、就绪状态、运行状态、阻塞状态、死亡状态
8. 获取线程的名字
9. 获取当前对象
10. 线程的sleep方法
11. 终止线程的睡眠
12. 合理的终止一个线程
13. 线程调度
13.1 线程调度概述
13.2 线程调度方法
14. 线程安全
#### 14.1 举例
#### 14.2 如何解决线程安全
14.3 同步和异步的理解
15. 同步代码块synchronized
线程同步机制的语法是:
synchronized(){
编程同步代码块
}
synchronized后面小括号中传的这个“数据“,是多线程共享的数据。才能达到多线程排队
16. Java中的三大变量
17. synchronized的三种写法
18. 死锁概述
public class Test01 {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
Thread t1 = new Mythread1(o1,o2);
Thread t2 = new Mythread2(o1,o2);
t1.start();
t2.start();
}
}
class Mythread1 extends Thread{
Object o1;
Object o2;
public Mythread1(Object o1,Object o2){
this.o1=o1;
this.o2=o2;
}
@Override
public void run() {
synchronized (o1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
}
}
}
}
class Mythread2 extends Thread{
Object o1;
Object o2;
public Mythread2(Object o1,Object o2){
this.o1=o1;
this.o2=o2;
}
@Override
public void run() {
synchronized (o2){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
}
}
}
}
19. 开发中如何解决线程安全问题
20. 守护线程概述
public class Test06 {
public static void main(String[] args) {
Thread t1 = new Mythread6();
t1.setName("备份数据系统");
//启动线程之前将线程设置为守护线程
t1.setDaemon(true);
t1.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"主线程"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Mythread6 extends Thread{
@Override
public void run() {
int i = 0;
//即使是死循环,但由于该线程是守护者,当用户线程结束,守护线程自动终止
while (true){
System.out.println(Thread.currentThread().getName()+"--->"+(++i));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
21. 实现定时器
22. 实现线程的第第三种方式
23.生产者和消费者模式
浙公网安备 33010602011771号