实例
class MyThread extends Thread { private int i = 0; @Override public void run() { for (i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } } }
public class ThreadTest { public static void main(String[] args) { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); if (i == 30) { Thread myThread1 = new MyThread(); // 创建一个新的线程 myThread1 此线程进入新建状态 Thread myThread2 = new MyThread(); // 创建一个新的线程 myThread2 此线程进入新建状态 myThread1.start(); // 调用start()方法使得线程进入就绪状态 myThread2.start(); // 调用start()方法使得线程进入就绪状态 } } } }
start 和 run的区别
线程的几种状态http://lavasoft.blog.51cto.com/62575/99153/
线程的名称
创建线程的第二种方法
手册中的操作实例
继承方式和实现 方式 的区别
实现方式 避免了继承的局限性。建议是用继承方式
多线程的安全问题
问题产生
问题解决
同步的前提
同步的优点和缺点
如果想要函数运行同步程序,只需要用synchronized 来修饰当前 方法
如何发现程序是否有同步的隐患 (多线程操作共享数据)
问题
程序修改 --- 调用同一个对象就是同一个锁了
如果同步函数被静态修饰呢,上面的同步函数和同步代码块将用的不是一个对象
接下来看下面的问题
单例模式中 懒汉式设计模式加上 同步锁。解决了并发时重复实例化的问题
每一次进来都进行判断,效率非常的低。 如何解决判断次数过多的问题。
在代码块中加锁,进行双重判断。如果条件不满足就不判断是否有锁了
多线程会产生死锁的问题
http://blog.csdn.net/pjz90/article/details/8655646
多线程新的操作。原来前面的视频都是旧版本的啊 ::>_<::
Lock 和 Condition
也就是这几步操作
生产者操作
消费者操作
停止线程
守护线程
如果主线程结束了,此线程自动退出
join
两个线程 和 主线程 在交替执行。 join后, t1拿到执行权,主线程等待,t1执行完,主线程才开始执行。
至于其他子线程没什么太大关系。
优先级&yield方法
优先级:抢资源的频率
默认的优先级都是5 (优先级一共10级)
1:MIN , 5:NORM,10:MAX
Java线程中有一个Thread.yield( )方法,很多人翻译成线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行。
yield 释放优先级,先让其他线程执行