Java基础_多线程2[线程控制]
Posted nwxayyf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.线程的生命周期
以上是关于Java基础_多线程2[线程控制]的主要内容,如果未能解决你的问题,请参考以下文章