Java多线程机制中使用Runnable接口以及线程的常用方法//设备管理概述(20.6.5)

Posted dasdfdfecvcx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程机制中使用Runnable接口以及线程的常用方法//设备管理概述(20.6.5)相关的知识,希望对你有一定的参考价值。

使用Runnable接口

首先我们要知道使用Thread创建的子类可以添加新的成员变量,以及添加方法,使用线程中的功能,但是Java不允许将子类再往后继承,也就是不能再扩展后代.

Runnable接口与目标对象

那么这时候就出现了使用Runnable接口
如果用Thread类直接创建对象通常使用以下的构造方法

Thread(Runnable taget) //
1
这个构造方法中就是接口Runnable变量,也就是说可以是实现接口中的类,当实例线程调用start()方法时,实质上就是调用target对象中的run()方法

另外创建目标类对象类在必要时还可以是某个特定类的子类,因此使用Runnable接口比使用Thread类的子类更加灵活

run()方法中的局部变量

对于具有相同目标对象的线程,当其中一个线程想用CPU资源时,目标对象自动调用接口中的run()方法,以及共享目标接口中的成员变.但是需要注意的是run()方法中的局部变量不共享的,互不干扰

在线程中启动其他线程 //可以想象为接力比赛

线程通过调用start()方法来启动线程,在线程执行期间是可以创建另一个线程并启动线程的,例如计算1-10的累加
线程1负责前半段的累加,线程2负责后半段的累加

例子

class Calculate implements Runnable { //实现接口
int sum = 0;
int i = 1;

@Override
public void run() {
Thread thread = Thread.currentThread(); //获取当前线程
while (i <= 10) {
sum = sum + i;
if (i == 5) {
Thread threadTwo = new Thread(this);
threadTwo.setName("线程2");
threadTwo.start();
i++; //因为没有机会执行下面的i++,所以要预先执行
System.out.println(thread.getName()+"计算前半段的结果是:" + sum);
return; //线程1进入死亡状态
}
i++;
}
System.out.println(thread.getName()+"接线程1计算到的结果是" + sum);
}
}

public class Example15_4 {
public static void main(String[] args) {
Thread threadOne = new Thread(new Calculate());
threadOne.setName("线程1");
threadOne.start();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
线程中常用的方法

start() //Thread类创建一个线程调用该方法使线程进入Runnable状态
run() //该方法是系统自动调用的方法,该方法指定了线程的使命
sleep(int millsecond) //让线程主动休息,也可以想象成让线程睡一会
isAlive() //检测线程是不是活的,当线程调用start()后才为true,直到进入TERMINATERD状态后变为false,另外没有调用start()时也为false
currentThread() //调用该方法返回当前使用CPU资源的线程
interrupt() //调用该方法是打断正在睡觉的线程,被吵醒的线程进入打断异常,结束睡觉进入Runnable状态
一个学生上课睡觉的例子

class Classroom implements Runnable{
Thread student;
Thread teacher;
Classroom(){
student = new Thread(this);
student.setName("吴爱睡");
teacher = new Thread(this);
teacher.setName("曹老师");
}
@Override
public void run() {
if (Thread.currentThread()==student){ //线程查看一下当前线程
try {
System.out.println(student.getName()+"正在睡觉");
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("被老师吵醒了");
try {
System.out.println("继续睡");
Thread.sleep(10000);
} catch (InterruptedException ex) {
System.out.println("又被老师吵醒了");
}
}
System.out.println(student.getName()+"开始听课");

}
else if(Thread.currentThread()==teacher){
for (int i = 1; i <=3 ; i++) {
System.out.println("上课!");
try {
Thread.sleep(500); //说一次窜一口气
} catch (InterruptedException e) {
e.printStackTrace();
}
}
student.interrupt(); //学生调用一个打断方法
for (int i = 1; i <=2 ; i++) {
System.out.println("上课!!!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
student.interrupt();
}

}
}
public class Example15_5 {
public static void main(String[] args) {
Classroom classroom = new Classroom();
classroom.student.start();
classroom.teacher.start();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
运行结果

C:UsersAdministrator.IntelliJIdea2019.3configjdbc-driversApache Derby10.14.1.0derby-10.14.1.0.jar" Chapter_15.Part_2.Example15_5
上课!
吴爱睡正在睡觉
上课!
上课!
上课!!!
被老师吵醒了
继续睡
上课!!!
又被老师吵醒了
吴爱睡开始听课

进程已结束,退出代码 0
1
2
3
4
5
6
7
8
9
10
11
12
13
设备管理概述

设备的分类

按设备上数据组织方式分类
块设备:指以数据块为单位组织和传送数据的设备,如碰盘、难带等
字符设备:指以单个字符为单位存取信息的设备,如终端、打印机等。
按资源分配的角度分类
独占设备:对这种设备来说,在一段时间内最多只能有一个进程占有并使用它低速/O设备一般是独占设备,如打印机、终端等。
共享设备:这类设备允许多个进程共享,即多个进程的I/O传输可以交叉。
虚拟设备:在一类设备上模拟另一类设备的技术称为虚设备技术。
按数据传输速率分类
低速设备:指传输速率为每秒钟几个字节到数百个字节的设备。典型的设备有键盘、鼠标、语音的输入等。
中速设备:指传输速率在每秒钟数千字节至数万字节的设备。典型的设备有行式打印机、激光打印机等。
高速设备:指传输速率在数十万个字节至数兆字节的设备。典型的设备有磁带机、磁盘机、光盘机等。
其他分类方法
按输入/输出对象的不同,设备可分为人机通信、机机通信设备。
设备管理的目标和任务

操作系统设备管理的目标
1.向用户提供使用外围设备的方便、统一的接口。
2.充分利用中断技术、通道技术和缓冲技术,提高CPU与设备、设备与设备之间的并行工作能力,提高外围设备的使用效率。
3.保证在多道程序环境下,当多个进程竞争使用设备时,按照一定的策略分配和管理设备,以使系统能有条不紊地工作。
设备管理的任务
设备管理的任务是保证在多道程序环境下,当多个进程竞争使用设备时,按一定策略分配和管理各种设备,控制设备的各种操作,完成输入/输出设备与内存之间的数据交换。
CET4P196

clear-cut
madden
blog
paddy
coinage
bribe
upgrade
fossil
commonplace
gravitation
nourish
vendor
breakdown
astronaut
geology
————————————————
原文链接:https://blog.csdn.net/ouqianbei/article/details/106570282

http://www.tianya.cn/142585408
http://www.tianya.cn/142607138/profile
http://www.tianya.cn/142607138
http://www.tianya.cn/142607169/profile
http://www.tianya.cn/142607169
http://www.tianya.cn/142607200/profile
http://www.tianya.cn/142607200
https://www.dianyuan.com/people/836826
https://www.dianyuan.com/people/836828
https://www.dianyuan.com/people/836829
https://weavi.com/20813871
https://weavi.com/20813870
https://weavi.com/20813869
https://weavi.com/20813866
https://weavi.com/20813863
https://weavi.com/20813860
https://weavi.com/20813854
https://weavi.com/20813853
https://weavi.com/20813847
https://weavi.com/20813844
https://weavi.com/20813841
https://weavi.com/20813839
https://weavi.com/20813814
https://weavi.com/20813813
https://weavi.com/20813811
https://weavi.com/20813808
https://weavi.com/20813804
https://weavi.com/20813803

以上是关于Java多线程机制中使用Runnable接口以及线程的常用方法//设备管理概述(20.6.5)的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程之Callable接口与Runnable的实现以及选择

Java多线程(详细了解java多线程机制)

一篇搞懂Java多线程运行机制

使用spring的多线程机制

Java多线程小结

Java多线程学习笔记— “建立线程的两种方法 (Thread类和Runnable接口)”