ExecutorService线程池
网络延迟和随机性造成负票 :
卖了相同票(cpu的原子性):
解决:
是否有多线程环境
是否有共享数据
是否有多条语句同事操作共享数据
只能改变第三种情况解决问题
线程同步互斥:耗费资源 死锁=====不满足就wait 然后让别人去做
生产消费者问题 在同步的基础上 加同一把锁 都要加锁 等待唤醒机制 条件不满足时就wait(),然后告诉别的可以notify(),notifyAll()
private Object obj=new Object();
synchronized (对象 必须是统一个对象 所以必须在外部创建) {
同步的代码块 就是多条语句同事操作共享数据的代码
里面的代码最好都是while
while(1<2)
{
obj.wait
}
obj.notify();
}
线程互斥
单线程: 以前我写过的所有代码都是单线程 因为只有一条执行路径
多线程:几个方法一起执行 多条路径
线程:在一个运行的程序中又有多个任务在进行 例如扫雷:我在点 它在在计时
高并发:在一个时间点 上 很多人访问
第一种实现:
Thread
//重写run方法 类里面的所有代码只有需要被线程执行的放在run方法
@Override
public void run() {
//被线程执行的代码 一定要在任务中属于比较耗时的
for(int i=0;i<1000;i++)
{
System.out.println(i);
}
}
public static void main(String[] args) {
//创建两个线程对象
Demo1 d1=new Demo1();
Demo1 d2=new Demo1();
//d.run() 如果直接调 是单线程的 跟普通方法没区别
/*
- run仅仅封装线程执行代码
- 开启线程是start,jvm方法会调run
*/
d1.start();
d2.start();
//输出结果 说明多线程有随记性
}
java采用的是优先级高分配算法 如果优先级相同 随机选择
System.out.println(d1.getPriority());//线程默认优先级是5 最大是10 最小是1
d1.setPriority(MAX_PRIORITY);//设置优先级高并不代表就没有随记性了 只有在次数特别多才有效果
Runable是个接口 使用的唯一区别就是把这个实例当做参数传给Thread
Runable可以解决单继承问题 所以大部分采用该方式
线程休眠
sleep()
线程加入
join();//在start()之后使用 必须在我 执行完毕之后你们才执行
礼让线程
yield()//只能在一定程度上 使线程在一定程度上持平执行 但是还是有随机性
守护线程
d1.setDaemon(true);//必须在start之前调用 就相当于塔克大战 王死 了 都死了 而那些小鬼就可以作为守护进程 因为只有守护进程的时候 虚拟机退出
关闭/中断线程
stop()// 过时不用
interpt()//用 但是也是利用它的 方法做flag
最正确的办法是立flag
生命周期
共同学习,写下你的评论
暂无评论
作者其他优质文章