Java基础_多线程2[线程控制]


多线程2[线程控制]

1.线程调度以及设置线程优先级

(1).线程调度的俩种模型
A:分时调度模型 所有的线程轮流使用CPU的使用权,平均分配每一个线程占用CPU的时间片。

B:抢占式调度模型 优先让优先级高的线程使用使用CPU,如果优先级相同,那么这一个时候就会随机的选择一个,优先级高的线程获取的CPU
的时间片相对多一点。
java使用的是抢占式调度模型。

(2).线程的优先级
A:获取线程的优先级
public final int getPriority():返回线程的优先级
//默认是5

B:设置线程的优先级
public final int setPriority(int i):设置线程的优先级
//线程的优先级的取值范围值是:1-10

异常:java.lang.IllegalArgumentException:非法参数异常,表明向方法传递了一个不正确的参数值

C:注意事项
线程的优先级高仅仅表示获取CPU的时间片的几率高,由于存在着随机性,只有在多次测试的情况下才可以看出效果。

(3).代码实现
//线程类
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i);
}
}
//测试类
public class ThreadTest {
public static void main(String[] args) {
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
mt.setName("大猪");
mt1.setName("小猪");
//设置线程优先级
mt.setPriority(10);
mt1.setPriority(1);
//获取默认优先级
//System.out.println(mt.getPriority());
//System.out.println(mt1.getPriority());
mt.start();
mt1.start();
}
}

2.线程控制之休眠线程

(1).方法
public static void sleep(long millis);//线程休眠时间,在指定的毫秒时间内让当前的线程"暂停一段时间"。

(2).代码实现
//线程类
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i+",时间是:"+new Date());
//睡眠
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}
//测试类
public class ThreadTest {
public static void main(String[] args) {
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
MyThread mt2 =new MyThread();
mt.setName("大猪");
mt1.setName("小猪");
mt2.setName("胖猪");
mt.start();
mt1.start();
mt2.start();
}
}


3.线程控制之加入线程

(1).什么时候使用加入线程
存在着先后顺序的时候,可以考虑使用加入线程。也就是其中的一个线程走完了,别的线程才可以去抢CPU的使用权,这一个情况就可以使用。

(2).加入线程方法
public final void join()
throws InterruptedException:等待该线程终止


(3).代码实现
//线程类
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i);
}
}
}
//测试类
public class ThreadTest {
public static void main(String[] args) {
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
MyThread mt2 =new MyThread();
mt.setName("大猪");
mt1.setName("小猪");
mt2.setName("胖猪");

mt.start();
try {
mt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
mt1.start();
mt2.start();
}
}
//结果
大猪先执行完,然后小猪和胖猪去抢cpu使用权


4.线程控制之礼让线程

(1).礼让线程方法
public static void yield():暂停正在执行的线程对象,并执行其他线程。


(2).礼让线程使用条件
让线程在一定的程度上保持和谐,也就是说A线程执行了,B线程执行,然后再A,然后再B....,这一个只会在一定程度上起作用(一人一次)。

(3).代码实现
//线程类
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i);
//设置礼让线程
Thread.yield();
}
}
}
//测试类
public class ThreadTest {
public static void main(String[] args) {
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
MyThread mt2 =new MyThread();
mt.setName("大猪");
mt1.setName("小猪");
mt2.setName("胖猪");

mt.start();
mt1.start();
mt2.start();
}
}


5.后台线程

(1).后台线程方法
public static void setDaemon(boolean on):将该线程标记为守护线程或者是用户组线程,当正在运行的线程都是守护线程时,java虚拟机退出
注意:该方法必须在启动线程前调用。

(2).代码实现
//线程类
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i);
}
}
}
//测试类
public class ThreadTest {
public static void main(String[] args) {
//其他线程执行内容
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
mt.setName("关羽");
mt1.setName("张飞");
//标记为守护线程(守护主线程)
mt.setDaemon(true);
mt1.setDaemon(true);

mt.start();
mt1.start();

//主线程执行内容
Thread.currentThread().setName("刘备");
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"----"+i);
}
}
}
//守护主线程,在for()循环执行到4的时候,别的俩个线程就会停止


6.线程控制之中断线程

(1).中断线程
public final void stop():结束一个线程(过时,但是仍然可以使用),具有不安全性,直接就退出,不会执行后续代码。
public void interrupt();结束一个线程,通过抛出异常的方式继续往下执行后续代码。


(2).代码实现
//线程类
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
System.out.println("开始"+new Date());
//休息10秒
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("休息10秒钟");
}

System.out.println("结束"+new Date());
}
}
//测试类
public class ThreadTest {
public static void main(String[] args) {
//其他线程执行内容
MyThread mt =new MyThread();
mt.setName("三胖");
mt.start();
//超过三秒不执行代码,那么就把这一个线程结束
try {
Thread.sleep(3000);
//mt.stop();
mt.interrupt();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//使用stop()方法,输出结果:
开始Sat Sep 01 00:04:27 CST 2018
//使用interrupt()方法,输出结果
开始Sat Sep 01 00:04:27 CST 2018
休息10秒钟
结束Sat Sep 01 00:04:30 CST 2018



7.线程的生命周期

 

猜你喜欢

转载自www.cnblogs.com/nwxayyf/p/9568875.html