Java多线程

1. 线程与进程

可以理解成:进程是软件,线程是软件的执行路径。

ii1Ä(Q)  O CPU  CPU  40% 2.72 GHz  o  68/7.9 (86%)  o  2.72 GHz  VMware Network Adapter VMnetI  O O Kbps  VMware Network Adapter VMnet8  O O Kbps  Wi-Fi  o  MILAN  O O Kbps  o  GPU O  Intel(R) HD Graphics 520  60  40%  271  3650  140542  Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz  2.40 GHz  128 KB  512 KB  3.0 MB

2.创建线程的3种方法

2.1继承Thread

public class MyThread extends Thread{  @Override  public void run() {  for(int  System. out. ;

第 0 ・ れ 、 0 「  package com. java. demo;  * 20 叭 ho. 「 liweijie  3 M 厂 ト 当  ー ?. MA 、 ES を M を  public class Demo {  ☆ 多 窺 オ  8  る rate ト ” ・ ( 0 ” 0 長 、  叩 鼓 ic static void main(String[] args){  MyThread m ニ new MyThread() :  m. start();  for(int ユ = ま く 1 の ユ + + ) イ  System. out. println("}+ili* 下 土 " + i) :  "C:\Program Files\Java\jdk-11.@.6\bin\java.exe"  -javaagent:C:\Program Files\JetBrains\InteIIiJ I(  汗 滴 禾 下 土 6  鋤 禾 日 当 午 ②  汗 滴 禾 下 土 1  働 禾 日 当 午 1  汗 滴 禾 下 土 2  働 禾 日 当 午 2  汗 滴 禾 下 土 5

2.2实现Runnable

这种创建线程的方法用的最多。

package com.java.demo;  public class MyRunnabIe implements  Override  public void run() {  for(int  Runnabte{  *tem. out. "+1) ;

' META-IN*  4MANlFEST.MF  , , , , , Cone-des  public static void main(String[] args){  /ÆiÆRunnable  创 建 一 个 任 务 対 象  MyRunnabIe 「 = new MyRunnabte() ;  创 建 - 个 线 程 , 并 为 其 分 配 - 个 任 务  new Thread(r) ;  Thread t  执 行 这 个 线 程  t.start()•l  for(int 0 ; 10 ; 』 + +  System.out.println("hi 是 地 上 1B"*i) ;  "C:\Program Fites\Java\jdk-11.@.6\bin\java.exe"  疑 是 地 上 霜@  窗 前 明 月 光@  疑 是 地 上 霜 1  窗 前 明 月 光  疑 是 地 上 霜 2  窗 前 明 月 光 2  -javaagent:C:\Program Files\JetBrains\Inte11iJ IDEA 2@2@

2.3带返回值的线程Callable

public static void args) throws ExecutionException,  = new MyCaIlabIe();  FutureTask task = new ;  new Thread(task) . start() ;  task.get();  Integer J  ; 1<1 ; J++  try {  Thread.steep( millis: 100) ;  catch (InterruptedException e) {  e. printStackTrace() ;  System. out. println(i) ;  static class Mycatlabte implements  @Override  public Integer call() throws Exception {  //Thread.sleep(3@@@) ;  for (int  try {  InterruptedException {

3.线程阻塞

所有耗时操作都是线程阻塞,例如:文件读取、等待用户输入。

4.线程中断

在之前的java版本中关闭一个子线程的做法是调用stop()方法,但是这个方法现在已经过时了。因为这种stop做法并不合理。因为:stop子线程,可能子线程并没有关闭一些流,这会导致一些资源占用问题。

合理的做法是:让线程自己死亡,简称自杀。用过线程中断,实现子线程自杀。

public static void args) throws InterruptedException {  Thread tl = new Thread(new MyRunnabte());  tl.start();  for(int 1=1; i++){  System. out. (Thread. currentThread() . getName() +" •  try {  Thread .steep( millis: ;  catch (InterruptedException e) {  e. printStackTrace() ;  tl. interrupt() ;

static class MyRunnabte implements  @0verride  public void run() {  for(int  Runnable{  System. out. printIn(Thread. current Thread() .getName()+  try {  Thread. steep( millis: ;  catch (InterruptedException e) {  //e. printStackTrace ( ) ;  System. out. printtn("  return;

29  31  32  33  34  35  36 ot  37  38  39  Run: Demo  tl. interrupt() ;  static class MyRunnabte implements  Override  public void run() {  for(int  Runnable{  System. out. println (Thread. current Thread() . getName() +  try {  Thread. steep( millis: ;  main: 3  main: 4  main: 5  Thread-@:5

5.线程安全问题

线程不安全的原因:是由多个线程同时执行,去争抢一个数据,去同时操作一个数据,导致某个数据看到的和自己在使用时不一样。(判断和使用,中间间隔了几行代码;在判断和使用期间被其他线程插足了)

解决方案:就是让某些线程在执行中间这些代码时(判断和使用的中间时),其他线程不能插足就可以了。怎么不能插足呢?就是排队执行就可以了。

5.1同步代码块

static class Ticket implements Runnable{  private int count = 10  private Object  = new Object();  @0verride  public void run() {  synchronized  System. out. printtn(" " ) ;  try {  Thread .steep( millis: ;  catch (InterruptedException e) {  e. printStackTrace() ;  count-- ;  System. out. printin (Thread. current Thread() . getName() + " ,  Yelse{  break;  : "*count) ;

5.2同步方法

public synchronized boolean  1  System. out. println("  try {  Thread. steep( millis: ;  catch (InterruptedException e) {  e. printStackTrace() ;

5.3 显示锁Lock

private int count  = new ReentrantLock() •  @0verride  public void run() {  l. lock();  System. out. println( " " ) ;  try {  Thread. Steep( millis: ;  catch (InterruptedException e) {  e. printStackTrace() ,

注意:不同的线程得看同一把锁,不然起不到效果。

6.多线程通信

匕 C 匕 d  Object  处 001 n  匕 C 匕 d  String  实 例 方 法  clone()  equals (Object  finalize 0  getC1ass()  hashCode()  notify 0  notifyA110  tostring 0  具 体 的 方 法  0b 〕 }  wait()  wait (long  wait (long  匕 n03 }  亡 m ou 匕 M 11 }  亡 m 匕 M 11  奔 用 的 方 法  创 建 返 回 此 对 象 的 副 本 。  指 示 某 个 其 他 对 象 罡 否 于 彐 比 对 象 。  已 过 时 。  品 终 确 定 枳 本 质 上 存 在 问 颗 。  返 回 此  的 运 行 时 类 。  O 处 〕 巴 c 匕  返 回 对 象 的 哈 希 码 值 。  唤 正 在 此 对 象 监 视 器 上 等 待 的 单 个 线 程 。  唤 等 待 此 对 象 监 视 器 的 所 有 线 程 。  返 回 对 象 的 字 符 串 表 示 形 式 。  导 致 当 前 线 程 等 待 它 裰 唤 , 通 常 罡 戲 。  导 致 当 前 线 程 等 待 它 裰 唤 , 通 常 罡 戲 , 或 者 直 到 经 过  导 致 当 前 线 程 等 待 它 裰 唤 , 通 常 罡 戲 , 或 者 直 到 经 过  一 定 量 的 实  一 定 量 的 实

多线程通信:加一个标志位,通过让两个线程分别歇着(wait)、唤醒(notify)来实现。

posted @ 2020-12-27 16:05  回到原点abc  阅读(113)  评论(0)    收藏  举报