java中实现多线程的几种方法,java实现多线程的三种方法

  java中实现多线程的几种方法,java实现多线程的三种方法

  

目录

Java多线程方法详细说明StartRunYieldJoinSleepinterUptTeam优先级摘要

 

  

Java 多线程方法详解

 

  

start

start方法启动线程调用start方法中的start0方法,start0是一个本地方法,其底层由c实现

 

  公共同步void start() { if (threadStatus!=0)抛出新的IllegalThreadStateException();group . add(this);boolean started=false请尝试{ start 0();开始=真;}最后{试试{ if(!started){ group . thread start failed(this);} } catch (Throwable ignore) { } } }私有本机void start 0();

  00-1010运行方法子线程的执行体在其方法体中编写线程逻辑。run方法和普通的成员方法一样,可以重复调用。当我们单独调用run方法时,run方法会在当前线程中执行,不会启动新的线程。

  00-1010Yield方法线程让步挂起当前线程的执行,并让位于具有相同优先级的其他线程,让其他线程先执行。

  yield方法是线程类中的静态方法

  public静态native void yield();特点

  yield方法的让步可以使正在执行的线程从“运行状态”进入“就绪状态”,等待预定的执行。Yield只是放弃CPU资源,让给谁,是有系统决定的.系统会让其他具有相同优先级或更高优先级的线程获得执行权。如果没有更高优先级的线程,它将继续执行原来的线程。

  00-1010join方法线程合并挂起当前线程的执行,然后在子线程执行完毕后继续执行当前线程,也叫线程插队。JOIN方法的作用是将并行或并发线程组合成串行执行。

  代码示例:

  公共类ThreadMethod02 {公共静态void main(String[] args)抛出InterruptedException { T2 t2=新T2();T2 . start();//主线程打印int count=0;for(int I=1;i=10I){ thread . sleep(1000);system . out . println( main I);if(count==5){ T2 . join();//Sub threads cut in line } } } class T2 extends thread { @ override public void run(){ for(int I=1;i=10i ) {尝试{

   Thread.sleep(1000);//休眠一秒钟 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("A" + i); } }}运行结果:

  

 

  

 

  

sleep

sleep线程休眠,在sleep期间,线程运行状态从运行进入到阻塞状态,会让出CPU的执行权,当线程被重新唤醒时,会由阻塞状态进入到就绪状态,等待CPU的使用权

 

  

方法介绍:

 

  sleep方法主要有两个,sleep(long millis)sleep(long millis, int nanos)两个方法功能类似,后一个方法提供更高精度的纳秒级控制。sleep方法是Thread里提供的静态方法,当前的方法也是可以抛出InterruptedException异常,可以被Interrupt中断掉。

 

  

 

  

Interrupt

代码示例:

 

  Interrupt中断线程interrupt方法调用仅仅修改了一个中断标志。 如果当前线程是可中断的状态(调用了sleep、join、wait等方法导致线程进入阻塞状态)在其他线程中调用interrupt方法,会立即抛出一个InterruptedException异常,来停止掉中断。如果当前处于运行状态,调用interrupt方法,线程会继续执行,直到发生sleep、join、wait等方法的调用,才会进入阻塞。

  Interrupt方法在Thread类中,是一个普通方法,可以通过对象来调用。

  

public class ThreadMethod03 { public static void main(String[] args) throws InterruptedException { T3 t3 = new T3(); t3.start(); for (int i = 0; i < 3; i++) { Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } t3.interrupt();//发送中断 }}class T3 extends Thread { @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println("A"); } try { System.out.println("进行休眠"); Thread.sleep(20000); } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName() + "被Interrupted!!!"); } }}

运行结果:

 

  

 

  

 

  

deamon

deamon方法守护线程Java线程有两种,一种是守护线程,一种是用户线程,用户线程一般用户执行用户级任务,一般创建的线程都是用户线程,守护线程也叫做后台线程服务于用户线程,一般就是用来执行后台任务,例如:垃圾回收就是由专门线程来处理的,负责垃圾回收的线程就是守护线程。

 

  守护线程存在两个方法

  public final void setDaemon(boolean on)设置守护线程,参数是true和false,true表明设置为守护线程, false,设置为非守护线程 ,默认是false。

  public final boolean isDaemon()判断是否守护线程,返回Boolean类型

  代码示例:

  

public class ThreadMethod04 { public static void main(String[] args) throws InterruptedException { T4 t4 = new T4(); t4.setDaemon(true);//将子线程设置为守护线程 t4.start(); if (t4.isDaemon()) {//判断是否是守护线程 System.out.println("子线程是守护线程"); }else { System.out.println("子线程不是守护线程"); } for (int i = 1;i <= 5;i++) { Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + i); } }}class T4 extends Thread { @Override public void run() { while (true) {//无限循环 try { Thread.sleep(1000);// 休眠1s钟 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } }}

运行结果:

 

  主线程结束,子线程同时结束

  

 

  

 

  

Priority

Priority线程优先级,就是用来指导线程执行的优先权

 

  方法介绍

  public final void setPriority(int newPriority):设置线程的优先级public final int getPriority():获取线程的优先级优先级范围

  

设置Java线程的优先级,最小值为1,默认值是5,最大值是10

 

  

public final static int MIN_PRIORITY = 1;public final static int NORM_PRIORITY = 5;public final static int MAX_PRIORITY = 10;

方法特点

 

  1.线程的优先级并不绝对,所控制的是执行的机会,优先级高的线程执行的概率是比较大,而优先级低的线程也并不是没有机会,只是执行的概率会低一些。

  2.优先级共10个优先级,分别为1-10,数值越大,表明优先级越高,普通的线程优先级是5。

  3.线程的优先级是用来指导JVM层面优先哪个线程执行,最终执行顺序还是需要操作系统来指定。

  4.注意:代码最好不要依赖于优先级线程,有可能会造成问题,Java中给定的优先级并不一定严格按照给定优先级执行。

  代码示例:

  

public class ThreadMethod05 { public static void main(String[] args) { T5 t5 = new T5(); t5.setPriority(10);//设置优先级为10 int priority = t5.getPriority();//获取优先级 System.out.println(priority); }}class T5 extends Thread { @Override public void run() { System.out.println("A"); }}

运行结果:

 

  

 

  

 

  

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注盛行IT的更多内容!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: