线程的调度
分时调度模型 线程轮流使用Cpu(平均分配CPU时间片)
抢占式调度模型 优先级高的线程获取Cpu的时间片相对多一些 如果优先级相同随机
(JVM默认采用抢占式)
m1 m2
异步编程模型 m1线程执行m1的 ,m2执行m2互不干扰
同步编程模型 m1和m2执行,当m1线程必须等m2执行结束后,m1线程才执行 这就是同步编程模型
1.为了数据的安全
2.什么条件下使用呢?
必须多线程环境
多线程环境必须共享一个数据
分时调度模型 线程轮流使用Cpu(平均分配CPU时间片)
抢占式调度模型 优先级高的线程获取Cpu的时间片相对多一些 如果优先级相同随机
(JVM默认采用抢占式)
m1 m2
异步编程模型 m1线程执行m1的 ,m2执行m2互不干扰
同步编程模型 m1和m2执行,当m1线程必须等m2执行结束后,m1线程才执行 这就是同步编程模型
1.为了数据的安全
2.什么条件下使用呢?
必须多线程环境
多线程环境必须共享一个数据
共享的数据会涉及到修改
依赖异常处理机制打断休眠
//依赖异常处理机制打断休眠
public class ThreadTest08 {
public static void main(String[] args) throws InterruptedException {
//启动5s后唤醒
Thread t = new Thread(new G());
//起名
t.setName("t");
t.start();
Thread.sleep(5000);
//打断
t.interrupt();
}
}
class G implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(1000000000000L);
System.out.println("我睡多久啦");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"---"+i);
}
}
}
线程休眠sleep与yield
先来看看下API中的方法描述哈~~
再来运行下代码
/*
*Thread.yield
*静态方法
*作用:给同一个优先级的线程让位,But时间不固定
*和Sleep方法相同But,But时间不固定
*/
public class text {
public static void main(String[]args) {
Thread t=new I();
t.setName("t");
t.start();
for(int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+"---->"+i);
}
}
}
class I extends Thread{
public void run() {
for(int i=0;i<10;i++)
{System.out.println(Thread.currentThread().getName()+"---->"+i);
if(i%2==0)
Thread.yield();
}}
}
终止线程的方法(不止以下的方法,有兴趣的道友可以来交流交流)
public class Texture {
public static void main(String[] args) throws Exception {
H h = new H();
Thread thread = new Thread(h);
thread.setName("t");
thread.start();
Thread.sleep(5000);
//终止
h.run = false;
}
}
class H implements Runnable{
boolean run = true;//利用布尔值来终止线程
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
if (run) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"---"+i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
return;
}
}
}
}