比如 有个学生在 即在写作业 又在聊qq, 多线程同时进行,当碰到阻塞事件 比如老师来了,聊qq 进入阻塞状态, 等老师走了,阻塞解除,这里注意 进入的是就绪状态,不是运行状态。 就好比 老师一走, 准备聊qq,但还不能直接聊,"cpu" 根据环境来调度执行.
一、停止线程:
1、正常执行完毕
2、外部干涉
1)、在线程类里面 定义线程体使用的标示
2)、线程体 使用该标示
3)、提供对外的方法 改变该标示 外部改变这个flag
eg:
public class Study implements Runnable {
//在线程类里面 定义线程体使用的标示
private boolean flag = true;
@Override
public void run(){
//线程体 使用该标示
while(flag){system.out.println(""); } }
}3、Thread 提供的 挂起 stop等不要使用 课查看api文档查看说明
二、阻塞
1、join:合并线程
2、sleep : 休眠 不释放锁 将该对象资源锁住 睡觉 ,sleep期间 该对象不能被操作.
常用于 时间相关的 比如倒计时
或者模拟网络延时
比如倒数10个数 一秒钟打印一个
package com.java.thread;
public class TestSleep extends Thread {
private int num =10;
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(num);
if(num<=0){
break;
}
num--;
}
}
public static void main(String[] args) {
TestSleep ts = new TestSleep();
Thread t1 = new Thread(ts);
t1.start();
}
}
模拟网络延迟:
package com.java.thread.web12306;
/**
* 模拟抢票
* @author Administrator
*
*/
//创建真实角色 实现 Runnable 接口
public class Web12306 implements Runnable{//相当于 静态代理 里面的 真实角色
private int num =10;
@Override
public void run() {
while(true){
if(num<=0){
break;
}
try {
Thread.sleep(1000);//模拟延迟一秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"抢到了第"+ num--+"张票");
}
}
public static void main(String[] args) {
//声明真实的对象
Web12306 web = new Web12306();
//代理对象
Thread thread1 = new Thread(web, "路人甲");
Thread thread2 = new Thread(web, "黄牛乙");
Thread thread3 = new Thread(web, "学生丙");
thread1.start();
thread2.start();
thread3.start();
}
}打印结果:
黄牛乙抢到了第10张票
学生丙抢到了第8张票
路人甲抢到了第9张票
路人甲抢到了第7张票
学生丙抢到了第6张票
黄牛乙抢到了第5张票
学生丙抢到了第4张票
黄牛乙抢到了第3张票
路人甲抢到了第2张票
学生丙抢到了第1张票
路人甲抢到了第0张票
黄牛乙抢到了第-1张票
出现了 0 -1 这就是多线程 对一个资源进行争抢的 并发性后果.
因为有三个代理在争抢一个实体, 假如还有最后1张票的时候, a代理进来 判断1<=0 ? 不小于 接着往下走,sleep 1秒钟, 此时b代理 进来,发现1不小于0,也同样进行
1秒等待, c进来同样的道理进行等待。 对a代理来说,1秒钟后 醒来,好拿走这张票 还剩0张, b醒来 已经是0了 但仍执行接下来的代码 c 同理.
所以多线程 的并发性问题需要解决.

被折叠的 条评论
为什么被折叠?



