java学习笔记--线程1

来源:互联网 发布:淘宝户外刀具可靠性 编辑:程序博客网 时间:2024/06/08 07:49

0、如何创建一个线程
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、这些简化了之前的交互模型
这里写图片描述
第一本发行到第九版第二本讲线程安全机制等。

0 0
原创粉丝点击