学习笔记_JavaSE_23_多线程的两种方式、安全问题、锁机制
2018-02-25 23:39
489 查看
1:多线程(理解)
(1)多线程:一个应用程序有多条执行路径
进程:正在执行的应用程序
线程:进程的执行单元,执行路径
单线程:一个应用程序只有一条执行路径
多线程:一个应用程序有多条执行路径
多进程的意义?
提高CPU的使用率
多线程的意义?
提高应用程序的使用率
(2)Java程序的运行原理及JVM的启动是多线程的吗?
A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。
B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。
(3)多线程的实现方案(自己补齐步骤及代码 掌握) 2种:
A:继承Thread类
步骤:
自定义类MyThread,继承Thread类
在MyThread类中,重写run()
创建MyThread类的对象
启动线程对象
代码:
public class MyThread extends Thread {
@Override
public void run() {
// 自己写代码
// System.out.println("好好学习,天天向上"); 这么简单的一句话是不需要开线程的
// 一般来说,被线程执行的代码肯定是比较耗时的。所以我们用循环改进
for (int x = 0; x < 200; x++) {
System.out.println(x);
}
}
}
public class MyThreadDemo {
public static void main(String[] args) {
// 创建两个线程对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
}
}
B:实现Runnable接口
步骤:
自定义类MyRunnable,实现Runnable接口
在MyRunnable类中,重写run()
创建MyThread类的对象
创建Thread类的对象,并把c步骤的对象作为构造参数来传递
代码:
public class MyRunnable implements Runnable {
@Override
public void run() {
for(int x=0;x<100;x++) {
System.out.println(Thread.currentThread().getName()+":"+x);
}
}
}
public class MyRunnableDemo {
public static void main(String[] args) {
MyRunnable my = new MyRunnable();
/* Thread t1 = new Thread(my);
Thread t2 = new Thread(my);
t1.setName("林青霞");
t2.setName("刘意");*/
Thread t1 = new Thread(my, "林青霞");
Thread t2 = new Thread(my, "刘意");
t1.start();
t2.start();
}
}
(4)线程的调度和优先级问题
A:线程的调度
a:分时调度
<
9e1a
span style="white-space:pre;"> b:抢占式调度 (Java采用的是该调度方式)
B:获取和设置线程的优先级
a:默认是5
b:范围是1-10
(5)线程的控制(常见方法)
A:休眠线程
B:加入线程
C:礼让线程
D:后台线程
E:终止线程(掌握)
(6)线程的生命周期(参照 线程生命周期图解.bmp)
A:新建
B:就绪
C:运行
D:阻塞
E:死亡
(7)电影院卖票程序的实现
A:继承Thread类 出问题
B:实现Runnable接口 推荐
(8)电影院卖票程序
A:为了更符合真实的场景,加入了休眠100毫秒。
B:卖票问题
a:同票多次
b:负数票
(9)多线程安全问题的原因 (也是我们以后判断一个程序是否有线程安全问题的依据)
A:是否有多线程环境
B:是否有共享数据
C:是否有多条语句操作共享数据
(10)同步解决线程安全问题
A:同步代码块
synchronized(对象) {
需要被同步的代码;
}
这里的锁对象,可以是任意对象。
B:同步方法
把同步加在方法上。
这里的锁对象,是this
C:静态同步方法
把同步加在方法上。
这里的锁对象,是当前类的字节码文件对象(反射部分,再讲字节码文件对象)
(11)回顾以前的线程安全的类
A:StringBuffer
B:Vector
C:Hashtable
D:如何把一个线程不安全的集合类,变成一个线程安全的集合类?
用Collections工具类的方法,即可。
List<String> list1 = new ArrayList<String>(); // 线程不安全
List<String> list2 = Collections.synchronizedList(new ArrayList<String>()); // 线程安全
(1)多线程:一个应用程序有多条执行路径
进程:正在执行的应用程序
线程:进程的执行单元,执行路径
单线程:一个应用程序只有一条执行路径
多线程:一个应用程序有多条执行路径
多进程的意义?
提高CPU的使用率
多线程的意义?
提高应用程序的使用率
(2)Java程序的运行原理及JVM的启动是多线程的吗?
A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。
B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。
(3)多线程的实现方案(自己补齐步骤及代码 掌握) 2种:
A:继承Thread类
步骤:
自定义类MyThread,继承Thread类
在MyThread类中,重写run()
创建MyThread类的对象
启动线程对象
代码:
public class MyThread extends Thread {
@Override
public void run() {
// 自己写代码
// System.out.println("好好学习,天天向上"); 这么简单的一句话是不需要开线程的
// 一般来说,被线程执行的代码肯定是比较耗时的。所以我们用循环改进
for (int x = 0; x < 200; x++) {
System.out.println(x);
}
}
}
public class MyThreadDemo {
public static void main(String[] args) {
// 创建两个线程对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
}
}
B:实现Runnable接口
步骤:
自定义类MyRunnable,实现Runnable接口
在MyRunnable类中,重写run()
创建MyThread类的对象
创建Thread类的对象,并把c步骤的对象作为构造参数来传递
代码:
public class MyRunnable implements Runnable {
@Override
public void run() {
for(int x=0;x<100;x++) {
System.out.println(Thread.currentThread().getName()+":"+x);
}
}
}
public class MyRunnableDemo {
public static void main(String[] args) {
MyRunnable my = new MyRunnable();
/* Thread t1 = new Thread(my);
Thread t2 = new Thread(my);
t1.setName("林青霞");
t2.setName("刘意");*/
Thread t1 = new Thread(my, "林青霞");
Thread t2 = new Thread(my, "刘意");
t1.start();
t2.start();
}
}
(4)线程的调度和优先级问题
A:线程的调度
a:分时调度
<
9e1a
span style="white-space:pre;"> b:抢占式调度 (Java采用的是该调度方式)
B:获取和设置线程的优先级
a:默认是5
b:范围是1-10
(5)线程的控制(常见方法)
A:休眠线程
B:加入线程
C:礼让线程
D:后台线程
E:终止线程(掌握)
(6)线程的生命周期(参照 线程生命周期图解.bmp)
A:新建
B:就绪
C:运行
D:阻塞
E:死亡
(7)电影院卖票程序的实现
A:继承Thread类 出问题
B:实现Runnable接口 推荐
(8)电影院卖票程序
A:为了更符合真实的场景,加入了休眠100毫秒。
B:卖票问题
a:同票多次
b:负数票
(9)多线程安全问题的原因 (也是我们以后判断一个程序是否有线程安全问题的依据)
A:是否有多线程环境
B:是否有共享数据
C:是否有多条语句操作共享数据
(10)同步解决线程安全问题
A:同步代码块
synchronized(对象) {
需要被同步的代码;
}
这里的锁对象,可以是任意对象。
B:同步方法
把同步加在方法上。
这里的锁对象,是this
C:静态同步方法
把同步加在方法上。
这里的锁对象,是当前类的字节码文件对象(反射部分,再讲字节码文件对象)
(11)回顾以前的线程安全的类
A:StringBuffer
B:Vector
C:Hashtable
D:如何把一个线程不安全的集合类,变成一个线程安全的集合类?
用Collections工具类的方法,即可。
List<String> list1 = new ArrayList<String>(); // 线程不安全
List<String> list2 = Collections.synchronizedList(new ArrayList<String>()); // 线程安全
相关文章推荐
- 【我的Java笔记】多线程安全问题 & 同步机制
- Java学习笔记45(多线程二:安全问题以及解决原理)
- iOS学习笔记-124.多线程23——多图下载3_第三种实现方式(使用SDWebImage)
- (47)Java学习笔记——多线程 / 线程的安全问题
- 多线程的安全问题。 创建线程的两种方式区别
- Java 中的多线程-两种创建方式,定时器的应用,线程的安全问题可以用银行转账来说明
- 0324的学习笔记----里面最重要的就是一个tom猫的动画,和涉及到的内存问题(创建imageview的两种方式,imagenamed就会形成缓存,占用很多内
- 学习笔记之JavaSE(23)--多线程3
- 黑马程序员--Java学习笔记之多线程(自定义线程的两种方式对比、线程状态、线程安全)
- Java 学习笔记16:用ThreadLocal解决多线程安全问题
- 黑马程序员—多线程的两种创建方式与多线程安全问题
- Apache ActiveMQ学习笔记【mq的方式有两种:点到点和发布/订阅】
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- Spring2.5.6学习笔记-DI的两种注入方式
- 多线程学习2,买火车票,并解决同步安全的问题
- ios学习笔记(四)收回软键盘的两种方式
- 【Java多线程学习】Java多线程的两种实现方式:继承Thread类 & 实现Runable接口
- 学习笔记:自定义方法的两种实现方式
- Flex学习笔记10——安全机制
- 【菜鸟C++学习笔记】23. 对象的传递机制