java学习笔记--线程1
2017-04-21 19:14
260 查看
0、如何创建一个线程
1、类继承Thread类:Thread Thread = new XXXThread()
2、实现runnable接口:
1、thread中yield()方法的用法
使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程了。
2、sleep()和yield()的区别
sleep是让线程进入阻塞状态,不能得到cpu,时间一到,就进入可执行状态(就绪),yield是从执行状态进入可执行状态。
3、什么时候用thread什么时候用runnable
当继承了一个thread类后就不能在继承thread类了,此时可以继续继承多个接口
4、java中的join方法:
其他所有线程等待调用此方法的线程执行结束
5、如何正确的停止一个线程
错误方法:stop()此方法会让线程戛然而止,不知道线程已经做了什么还没做什么,没有机会完成清理工作
正确的方法:使用退出标志,如在while循环的条件使用标志,当标志位true时线程继续执行,在需要结束线程的地方设置标志位false。
正确使用interrupt方法结束线程:在while中用!isinterrupted做结束标志,但是当线程因为调用sleep等方法进入阻塞状态是,isinterrupted将不会返回true,即interrupt方法不起作用,所以不推荐用这种方法。
6、查阅java api文档:ctrl+f可以调出查找工具栏,要一补的查找,先找最上层的类。。。。。
7、java中的格式化输出使用printf而不是println,%n:相当于\n回车换行符
8、java线程的同步与互斥
wait()、notify():随机唤醒一个线程、notifyAll():唤醒所有等待的线程,这些方法都属于object对象而不属于thread对象,用来实现同步,
synchronized(lockObj){}代码块用来实现互斥。
创建一个锁:private final Object lockObj = new Object();
9、volatile关键字用法
volatile可以保证线程不保留主存中变量的副本,而是直接操作主存中的变量,因而保证线程每次访问的变量都是最新的,但是volatile关键字不能代替synchronized因为,volatile并不能保证操作的原子性。
java内存分配简介:用在多线程,同步变量。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A)
在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。
一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程
memory中。以下例子展现了volatile的作用:
public class StoppableTask extends Thread {
private volatile boolean pleaseStop;
public void run() {
while (!pleaseStop) {
// do some stuff…
}
}
public void tellMeToStop() {
pleaseStop = true;
}
}
public class StoppableTask extends Thread {
private volatile boolean pleaseStop;
public void run() {
while (!pleaseStop) {
// do some stuff…
}
}
public void tellMeToStop() {
pleaseStop = true;
}
}
假如pleaseStop没有被声明为volatile,线程执行run的时候检查的是自己的副本,就不能及时得知其他线程已经调用tellMeToStop()修改了pleaseStop的值。
Volatile一般情况下不能代替sychronized,因为volatile不能保证操作的原子性,即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++,volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。如果配合Java 5增加的atomic wrapper classes,对它们的increase之类的操作就不需要sychronized。
10、扩展java线程知识需要学习的东西
①Java Memory Mode:JMM描述了java线程如何通过内存进行交互、happens-before、synchronized、volatile&final。
②Locks&Condition:java锁机制和等待条件的高层实现、java.util.concurrent.locks
③线程的安全性:原子性和可见性、java.util.concurrent.atomic、synchronized&volatile、DeadLocks。
④多线程编程常用的交互模型:Producer-Consumer模型、Read-Write lock模型、Future模型、Worker Thread模型。(思考java中哪些类是实现了这些模型供我们调用的)
⑤java5中并发编程工具(一些对象):java.util.concurrent、线程池 ExecutorService、 Callable&Future、BlockingQueue、这些简化了之前的交互模型
第一本发行到第九版第二本讲线程安全机制等。
1、类继承Thread类:Thread Thread = new XXXThread()
2、实现runnable接口:
class Actress implements Runnable{} Thread actressThread = new Thread(new Actress(),"Ms.Runnable");
1、thread中yield()方法的用法
使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程了。
2、sleep()和yield()的区别
sleep是让线程进入阻塞状态,不能得到cpu,时间一到,就进入可执行状态(就绪),yield是从执行状态进入可执行状态。
3、什么时候用thread什么时候用runnable
当继承了一个thread类后就不能在继承thread类了,此时可以继续继承多个接口
4、java中的join方法:
其他所有线程等待调用此方法的线程执行结束
5、如何正确的停止一个线程
错误方法:stop()此方法会让线程戛然而止,不知道线程已经做了什么还没做什么,没有机会完成清理工作
正确的方法:使用退出标志,如在while循环的条件使用标志,当标志位true时线程继续执行,在需要结束线程的地方设置标志位false。
正确使用interrupt方法结束线程:在while中用!isinterrupted做结束标志,但是当线程因为调用sleep等方法进入阻塞状态是,isinterrupted将不会返回true,即interrupt方法不起作用,所以不推荐用这种方法。
6、查阅java api文档:ctrl+f可以调出查找工具栏,要一补的查找,先找最上层的类。。。。。
7、java中的格式化输出使用printf而不是println,%n:相当于\n回车换行符
8、java线程的同步与互斥
wait()、notify():随机唤醒一个线程、notifyAll():唤醒所有等待的线程,这些方法都属于object对象而不属于thread对象,用来实现同步,
synchronized(lockObj){}代码块用来实现互斥。
创建一个锁:private final Object lockObj = new Object();
9、volatile关键字用法
volatile可以保证线程不保留主存中变量的副本,而是直接操作主存中的变量,因而保证线程每次访问的变量都是最新的,但是volatile关键字不能代替synchronized因为,volatile并不能保证操作的原子性。
java内存分配简介:用在多线程,同步变量。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A)
在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。
一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程
memory中。以下例子展现了volatile的作用:
public class StoppableTask extends Thread {
private volatile boolean pleaseStop;
public void run() {
while (!pleaseStop) {
// do some stuff…
}
}
public void tellMeToStop() {
pleaseStop = true;
}
}
public class StoppableTask extends Thread {
private volatile boolean pleaseStop;
public void run() {
while (!pleaseStop) {
// do some stuff…
}
}
public void tellMeToStop() {
pleaseStop = true;
}
}
假如pleaseStop没有被声明为volatile,线程执行run的时候检查的是自己的副本,就不能及时得知其他线程已经调用tellMeToStop()修改了pleaseStop的值。
Volatile一般情况下不能代替sychronized,因为volatile不能保证操作的原子性,即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++,volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。如果配合Java 5增加的atomic wrapper classes,对它们的increase之类的操作就不需要sychronized。
10、扩展java线程知识需要学习的东西
①Java Memory Mode:JMM描述了java线程如何通过内存进行交互、happens-before、synchronized、volatile&final。
②Locks&Condition:java锁机制和等待条件的高层实现、java.util.concurrent.locks
③线程的安全性:原子性和可见性、java.util.concurrent.atomic、synchronized&volatile、DeadLocks。
④多线程编程常用的交互模型:Producer-Consumer模型、Read-Write lock模型、Future模型、Worker Thread模型。(思考java中哪些类是实现了这些模型供我们调用的)
⑤java5中并发编程工具(一些对象):java.util.concurrent、线程池 ExecutorService、 Callable&Future、BlockingQueue、这些简化了之前的交互模型
第一本发行到第九版第二本讲线程安全机制等。
相关文章推荐
- Thinking in Java学习笔记,简单包装Thread,实现快速实现线程
- 0039 Java学习笔记-多线程-线程控制、线程组
- Java线程学习和笔记——黑马训练营
- 黑马程序员--Java学习笔记之多线程(自定义线程的两种方式对比、线程状态、线程安全)
- JAVA学习笔记之四线程层次结构
- Java学习笔记 线程,注解(注释)...
- 21天学通Java学习笔记-Day07(异常-断言-线程)
- JAVA学习笔记-----线程
- java基础学习笔记之九--线程(1)
- JAVA学习笔记49——线程概念+进程、线程区别+创建进程三种方法
- 黑马程序员—11—java基础:有关线程通信的学习笔记和学习心得体会
- [java 编程思想学习笔记] java 线程状态
- 学习笔记-java线程
- JAVA学习笔记(1)_____模拟线程通信之生产者消费者问题
- Java学习笔记45:Java 线程与主线程之间的变量关系
- 学习笔记2:java中Thread类与线程的创建
- Java并发学习笔记(1) 线程与进程
- Java并发学习笔记(16)守护线程,线程组
- Java并发学习笔记(13)线程之间的协作(Object.wait(),notifu(),notifyAll() Thread.join())
- Java线程学习笔记