Java进阶之多线程
2021-05-28 05:02
标签:== 创建 ati cep object类 art private task 处理 概念:是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码。 2.进程(process) 概念:程序的一次执行过程,或是正在运行的一个程序。 概念:进程可进一步细化为线程,是一个程序内部的一条执行路径。 补充: 进程可以细化为多个线程。 方式一:继承Thread类的方式: 说明两个问题: 方式二:实现Runnable接口的方式: 两种方式的对比: Thread类中的常用的方法: 线程通信:wait() / notify() / notifyAll() :此三个方法定义在Object类中的。 补充:线程的分类 图示: 说明: 3.阻塞:临时状态,不可以作为最终状态 例子:创建个窗口卖票,总票数为100张.使用实现Runnable接口的方式 在Java中,我们通过同步机制,来解决线程的安全问题。 方式一:同步代码块 方式二:同步方法 方式三:Lock锁 --- JDK5.0新增 使用的优先顺序: Lock ---> 同步代码块(已经进入了方法体,分配了相应资源 ) --->? 同步方法(在方法体之外) 同步的方式,解决了线程的安全问题。---好处 面试题:Java是如何解决线程安全问题的,有几种方式?并对比几种方式的不同 面试题:synchronized和Lock方式解决线程安全问题的对比 使用同步机制将单例模式中的懒汉式改写为线程安全的。 面试题:写一个线程安全的单例模式。 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 面试题:sleep() 和 wait()的异同? 小结释放锁的操作: 小结不会释放锁的操作: 新增方式一:实现Callable接口。 --- JDK 5.0新增 说明: 新增方式二:使用线程池 说明: 面试题:Java中多线程的创建有几种方式?四种。 Java进阶之多线程 标签:== 创建 ati cep object类 art private task 处理 原文地址:https://www.cnblogs.com/Huang-ze/p/14805653.html一、程序、进程、线程的理解
1.程序(programm)
说明:进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域3.线程(thread)
说明:线程作为调度和执行的单位,每个线程拥独立的运行栈和程序计数器(pc),线程切换的开销小。
内存结构:
每个线程,拥有自己独立的:栈、程序计数器
多个线程,共享同一个进程中的结构:方法区、堆。二、并行与并发
1.单核CPU与多核CPU的理解
2.并行与并发的理解
三、创建多线程的两种方式
问题一:我们启动一个线程,必须调用start(),不能调用run()的方式启动线程。
问题二:如果再启动一个线程,必须重新创建一个Thread子类的对象,调用此对象的start().
四、Thread类中的常用方法
一种是守护线程,一种是用户线程。五、Thread的生命周期
1.生命周期关注两个概念:状态、相应的方法
2.关注:
死亡:最终状态。六、线程的同步机制
1.背景
2.Java解决方案:同步机制
synchronized(同步监视器){
//需要被同步的代码
}
在继承Thread类创建多线程的方式中,慎用this充当同步监视器,考虑使用当前类充当同步监视器。
3.利弊
操作同步代码时,只能一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低。4.
线程安全的单例模式(懒汉式)
class Bank{
private Bank(){}
private static Bank instance = null;
public static Bank getInstance(){
//方式一:效率稍差
// synchronized (Bank.class) {
// if(instance == null){
//
// instance = new Bank();
// }
// return instance;
// }
//方式二:效率更高
if(instance == null){
synchronized (Bank.class) {
if(instance == null){
instance = new Bank();
}
}
}
return instance;
}
}
饿汉式。
懒汉式:上面提供的。死锁问题
1.死锁的理解:
2.说明:
3.举例:
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
new Thread(){
@Override
public void run() {
synchronized (s1){
s1.append("a");
s2.append("1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2){
s1.append("b");
s2.append("2");
System.out.println(s1);
System.out.println(s2);
}
}
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (s2){
s1.append("c");
s2.append("3");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1){
s1.append("d");
s2.append("4");
System.out.println(s1);
System.out.println(s2);
}
}
}
}).start();
}
七、线程通信
1.线程通信涉及到的三个方法:
2.说明:
3.面试题:
4.
八、JDK5.0新增线程创建的方式
//1.创建一个实现Callable的实现类
class NumThread implements Callable{
//2.实现call方法,将此线程需要执行的操作声明在call()中
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 1; i
class NumberThread implements Runnable{
@Override
public void run() {
for(int i = 0;i
下一篇:python中字典生成式