首页 > 编程语言 >java多线程几个方法的基本概念

java多线程几个方法的基本概念

时间:2023-09-07 14:06:07浏览次数:45  
标签:java Synchronized 数据 池中 线程 优先级 多线程 方法 基本概念


 一、run()和start()

  这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.

  二、关键字Synchronized

  这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。

  

 

以下是引用片段:
public ThreadTest implements Runnable 
  { 
  public synchronized void run(){ 
  for(int i=0;i<10;i++) 
  { 
  System.out.println(" " + i); 
  } 
  } 
  public static void main(String[] args) 
  { 
  Runnable r1 = new ThreadTest(); 
  Runnable r2 = new ThreadTest(); 
  Thread t1 = new Thread(r1); 
  Thread t2 = new Thread(r2); 
  t1.start(); 
  t2.start(); 
  } 
  }

 

  以上这段程序中的 i 变量并不是共享数据,也就是这里的Synchronized关键字并未起作用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和r2两个对象的i变量是并不是共享数据。

  当把代码改成如下:Synchronized关键字才会起作用

 

以下是引用片段:
 Runnable r = new ThreadTest(); 
  Thread t1 = new Thread(r); 
  Thread t2 = new Thread(r); 
  t1.start(); 
  t2.start();

  三、sleep()

  使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常

  比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。

  总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

  四、join()

  join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。

  五、yield()

  它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。

  六、wait()和notify()、notifyAll()

  这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized 这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。

  wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有

  锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

  notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

标签:java,Synchronized,数据,池中,线程,优先级,多线程,方法,基本概念
From: https://blog.51cto.com/u_2544485/7396472

相关文章

  • 无涯教程-JavaScript - BITAND函数
    描述BITAND函数返回两个数字的按位"AND"。语法BITAND(number1,number2)争论Argument描述Required/Optionalnumber1Mustbeindecimalformandgreaterthanorequalto0.Requirednumber2Mustbeindecimalformandgreaterthanorequalto0.Required......
  • Java的System.setProperty()和System.getProperty()
    写在前面:这里的System,系统指的是JRE(runtime)system,不是指OS。参数设置成为系统的全局变量,可以在项目的任何一个地方,通过System.getProperty("变量");来获得。System.setProperty相当于一个静态变量,存在内存里面!System.setProperty()/* *设置指定键对值的系统属性 *......
  • java内容偏多 一般有用 看1
                              ......
  • JavaNote03-流程控制语句
    0.流程控制语句流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。程序设计中规定的3种流程结构,即:顺序结构程序从上到下逐行地执行,中间没有任何判断和跳转。分支结构根据条件,选择性地执行某段代码。有if…else和switch-......
  • 无涯教程-JavaScript - BIN2DEC函数
    描述BIN2DEC函数将二进制数字转换为十进制。语法BIN2DEC(number)争论Argument描述Required/Optionalnumber您要转换的二进制数。Numbercannotcontainmorethan10characters(10bits).数字的最高有效位是符号位。其余的9位是幅度位。负数使用二进制补码表示......
  • a href=#与 a href=javascript:void(0)的区别?
    一个<a>链接的按钮可在该窗口上弹出一个div悬浮层。但是每次点击,div悬浮层就自动位于IE窗口的顶端,下面的iframe窗口包含的页面会自动上移,位置错乱了。href='#'οnclick='click事件名()'></a>这里的href='#'的原因,把它改成三个#就没问题了,即修改为<ahref='###'     嘿,还真好......
  • 关于多线程的相关概念
    多线程多线程的好处多线程可以提高CPU的使用效率比如单线程运行时遇到网络等待的耗时操作时,只能乖乖的等待,且交互终端但是多线程的情况下,一个线程负责交互,另一个负责计算线程的访问权限知道哪些数据是线程私有,哪些变量是线程之间共享数据线程调度和优先级当线程数量......
  • Javascript 中对HTML编码和解码的方法
    String.prototype.HTMLEncode=function(){vartemp=document.createElement("div");(temp.textContent!=null)?(temp.textContent=this):(temp.innerText=this);varoutput=temp.innerHTML;temp=null;returnoutput;}String.prot......
  • Java Excel导入信息加入数据库
    0.导入依赖<!--EasyExcel依赖开始--><dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.2.1</version></dependency><!--EasyExcel依赖结束-->1.在controlle......
  • 04Java学习_DOS原理和路径详解
    DOS原理和路径详解DOS原理Dos:DiskOperatingSystem磁盘操作系统。路径详解相对路径:从当前目录开始定位,形成的一个路径。绝对路径:从顶级目录开始定位,形成的一个路径。..\表示到上一级目录。参考链接:DOS原理相对与绝对路径DOS常用命令查看当前目录有什么内容,......