博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Thread线程类及多线程
阅读量:6084 次
发布时间:2019-06-20

本文共 2451 字,大约阅读时间需要 8 分钟。

1.进程、线程、并发、并行是什么?

1)进程:操作系统中可以运行多个任务(程序),这些运行的任务(程序)被称为进程。程序的运行产生进程(内存空间、程序执行的堆栈),可以这样说,进程是作为操作系统分配资源的基本单位。

2)线程:程序里同时可能运行多个任务(在一个CPU时间片内,顺序执行流),那么每个任务(顺序执行流)就叫做一个线程,即在线程内部。

3)并发:线程是并发运行的。操作系统将时间化分为若干个片段(时间片),尽可能的均匀分配给每一个任务,被分配时间片后,任务就有机会被cpu所执行。微观上看,每个任务都是走走停停的。但随着cpu高效的运行,宏观上看所有任务都在运行这种都运行的现象称之为并发,但不是绝对意义上的“同时发生”。

 4)并行:一个时间段,多个任务同时进行,而且多个CPU运行各自的进程。

 2.多线程的实现

1)继承Thread

 通过查阅JDK API文档,Thread 类位于java.lang中,表示进程中的执行线程。实现多线程有两种方式。第一是继承Thread:

1 package cn.a1.a; 2  3 public class MyThread extends Thread { 4  5     @Override 6     public void run() { 7         System.out.println("这是多线程MyThread"); 8         for (int i = 0; i < 5; i++) { 9             System.out.println("MyThread:" + i);10         }11 12     }13 }
1 package cn.a1.a; 2  3 public class Test1 { 4     public static void main(String[] args) { 5         // 创建一个多线程,此时已有两个线程 主线程(main) 和 创建的线程 mThread1; 6         MyThread mThread1 = new MyThread(); 7         mThread1.start(); 8  9         // 查看主线程main是否运行10         for (int i = 0; i < 5; i++) {11             System.out.println("main Thread:" + i);12         }13 14     }15 16 }

main线程和t1线程抢占CPU 执行,输出也是main线程和t1线程根据内部抢占CPU 执行输出,不规则,多线程在提高CPU利用率的同时,增加程序的复杂度。

main Thread:0这是多线程MyThreadmain Thread:1MyThread:0main Thread:2MyThread:1main Thread:3MyThread:2MyThread:3main Thread:4MyThread:4

 

2)实现Runnable接口

用于定义线程要执行的任务逻辑。我们定一个类实现Runnable接口,这时我们必须重写run方法,在其中定义我们要执行的逻辑。之后将Runnable交给线程去执行。从而实现了线程与其执行的任务分离开。将任务分别交给不同的线程并发处理,可以使用线程的重载构造方法:Thread(Runnable runnable)。解藕:线程与线程体解藕,即打断依赖关系。 如果你学到Spring了就知道,Spring的ioc就是干这个的。

 演示:

1 package cn.a1.a1; 2  3 public class MyRun implements Runnable { 4  5     @Override 6     public void run() { 7         System.out.println("这是MyRun"); 8          9         for (int i = 0; i < 3; i++) {10             System.out.println("MyRun:" + i);11         }12     }13 }

 

1 public class Test1 { 2     public static void main(String[] args) { 3         MyRun tRun1  = new MyRun(); 4         Thread t1 = new Thread(tRun1); 5         t1.start(); 6         //这里main开始运行也有产生一个进程,该进程有个主(main)线程 7         for (int i = 0; i < 3; i++) { 8             System.out.println("main"+i); 9         }10         11     }12 13 }

输出不规则的

main0这是MyRunMyRun:0main1main2MyRun:1MyRun:2

继承Thread和实现Runnable接口实现多线程的优缺点

[1] 继承Thread的线程类不能再继承其他类,实现Runnable接口的类还可以继承其他类。

[2] 实现Runnable接口的线程类,可以让多个线程共享线程实现类的资源

总结:

多线程提高了cpu利用率,但程序的复杂度也随之增加。一旦线程开始执行,很难通过其他方式控制线程的轨迹。

多个线程抢占CPU导致线程的运行轨迹不确定。

转载于:https://www.cnblogs.com/abcdjava/p/10840670.html

你可能感兴趣的文章
本地连接linux虚拟机的方法
查看>>
某公司面试java试题之【二】,看看吧,说不定就是你将要做的题
查看>>
BABOK - 企业分析(Enterprise Analysis)概要
查看>>
Linux 配置vnc,开启linux远程桌面
查看>>
CentOS6.4关闭触控板
查看>>
React Native 极光推送填坑(ios)
查看>>
Terratest:一个用于自动化基础设施测试的开源Go库
查看>>
修改Windows远程终端默认端口,让服务器更安全
查看>>
扩展器必须,SAS 2.0未必(SAS挺进中端存储系统之三)
查看>>
Eclipse遇到Initializing Java Tooling解决办法
查看>>
while((ch = getchar()) != '\n')
查看>>
好程序员web前端分享JS检查浏览器类型和版本
查看>>
Oracle DG 逻辑Standby数据同步性能优化
查看>>
exchange 2010 队列删除
查看>>
「翻译」逐步替换Sass
查看>>
H5实现全屏与F11全屏
查看>>
处理excel表的列
查看>>
C#数据采集类
查看>>
quicksort
查看>>
【BZOJ2019】nim
查看>>