创建线程的方式 1 :继承thread
myThread.start(); 会执行里面的for循环, 和主线程for抢占资源, 谁先得到资源谁执行
获取线程名称和线程id :
getId getName 是从thread 继承过来的
假如不是继承thread 就无法用到上面的方式 以下方式可解决
修改线程名称两种方式:1.
注意点:在启动之前给修改了
2.第二种方式
创建线程的第二种方式 :
实现runnable 多了一个步骤, Thread mr = new yhread(mr)
匿名内部类 方式启动线程:
Sleep 休眠
每打印一次休息一秒钟
yield 让步
join
j1.join 先执行j1 执行完在执行主线程
线程优先级
创建3个线程 P1 设成 优先级1 , p3 设成优先级10 , 就会先执行P3 ,因为优先级高。在执行p2 最后p1
守护线程
把d1设置成守护线程 下面的for 循环是前台线程,当前台线程执行完毕,后台线程随机中断(如图后台线程只执行到4)
下标为0 一次只允许一个线程使用
假如线程B抢到资源,s[index] ="world" s[0]=world 这时index++还未执行 ,A线程抢占资源执行,覆盖 world 变成hello,
加锁
同步代码块:
执行1 完的时候 被3抢去执行,执行完3,又被2抢去执行,最后执行4
造成数据的不准确
解决方法:
同一线程执行这个方法的时候,只有当这个方法执行完并释放锁,其他方法才能执行
分别加同步锁,结果如下:
如果是静态方法 里面参数是属于这个类
死锁
男女朋友去餐厅吃饭 餐厅只发了没人一根筷子 我想要你的 ,你想要我的 , 产生死锁。
两个锁对象(两根筷子)
男孩
女孩
运行:
男孩吃完了 ,吧筷子给女孩 就都可以吃了
例子:
private boolean flag; 默认为false;
把if 改成 while
创建4个线程池,