你真的了解Java的多线程方法吗

目录
  • Java 多线程方法详解
    • start
    • run
    • yield
    • join
    • sleep
    • Interrupt
    • deamon
    • Priority
  • 总结

Java 多线程方法详解

start

start方法 启动线程 在start方法中调用start0方法,而start0是一个本地方法,其底层是C++实现的。

    public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }
    private native void start0();

run

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

yield

yield方法线程让步暂停当前线程的执行,并让步于其他同优先级的线程,让其他线程先执行

yield方法是Thread类中的静态方法

public static native void yield();

特点

  • yield方法的让步,能让正在执行的线程由“运行状态”进入到“就绪状态”,等待调度执行。
  • yield仅仅是让出CPU资源,让给谁,是有系统决定的,系统会让其他相同优先级或者是更高优先级的线程来获取执行权,要是没有更高优先级的线程,会继续执行原来的线程。

join

join 方法 线程合并 暂停当前线程的执行,等待子线程执行完毕再继续执行当前线程,也叫做线程插队,join方法做的事情就是讲并行或并发执行的线程合并为串行执行。

代码示例:

public class ThreadMethod02 {
    public static void main(String[] args) throws InterruptedException {
        T2 t2 = new T2();
        t2.start();
        //主线程打印
        int count = 0;
        for (int i = 1; i <= 10; i++) {
            Thread.sleep(1000);
            System.out.println("main" + i);
            if (++count == 5) {
                t2.join();//子线程插队
            }
        }
    }
}
class T2 extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            try {
                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");
    }
}

运行结果:

总结

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

(0)

相关推荐

  • Java多线程之如何确定线程数的方法

    关于多线程的线程数的确定,最近研读过几篇paper,在此做一下笔记,方便使用时翻看. 1.<Java 虚拟机并发编程>中介绍 就是说:线程数 = CPU的核心数 * (1 - 阻塞系数) 另一篇:<Java Concurrency in Practice>即<java并发编程实践>,给出的线程池大小的估算公式: Nthreads=Ncpu*Ucpu*(1+w/c),其中 Ncpu=CPU核心数,Ucpu=cpu使用率,0~1:W/C=等待时间与计算时间的比率 仔细推敲两

  • Java多线程异步调用性能调优方法详解

    目录 概述 同步调用和异步调用 Future类图 Future的不足 代码 代码地址 Test PaymentService CheckService OrderService 总结 概述 大型电商公司的支付聚合服务都有这类的场景: 调用校验服务校验待生成的订单是否合法 订单服务生成订单(校验服务和订单服务没有依赖关系) 调用1和2,支付服务实现支付核心的功能 结合步骤1至3完成支付服务的聚合调用 ​假如步骤1的耗时5秒,步骤2的耗时3秒,步骤3的耗时2秒,如果你是架构师,要求:​ 1.请实现微

  • Java 多线程传值的四种方法

    其实大家都知道多线程传值有三种方式: 1:通过构造方法传递数据 2:通过变量和方法传递数据 3:通过回调函数传递数据 那么博主有个非常变态的需求,所以找出了第四种实现方式,先看效果图: 动态Cron4j调度器,我曾经发过类似的文章,可以去搜索一下. 点击执行走下边的代码,然后根据类名反编译 public static void executeCron4j(String packageClass){ try { Object taskObj = classNewInstance(packageCl

  • java中多线程与线程池的基本使用方法

    目录 前言 继承Thread 实现Runnale接口 Callable 线程池 常见的4种线程池. 总结 前言 在java中,如果每个请求到达就创建一个新线程,开销是相当大的.在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多.除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源.如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或"切换过度"而导致系统资源不足.为了防止资源不足,服务器应用程

  • Java基础之多线程方法状态和创建方法

    目录 Java之线程的五大状态及其常用方法(六个状态还有timed_wating超时等待) 1.线程的五大状态及其转换 2.设置或获取多线程的线程名称的方法 3.线程休眠------sleep()方法 4.线程让步------yield()方法 5. 等待线程终止------join()方法 6. 线程停止 7. 线程等待------wait()方法 8. 线程唤醒-------notify()方法 9. notifyAll()方法 JAVA多线程有哪几种实现方式? 1. 继承Thread类 2

  • 你真的了解Java的多线程方法吗

    目录 Java 多线程方法详解 start run yield join sleep Interrupt deamon Priority 总结 Java 多线程方法详解 start start方法 启动线程 在start方法中调用start0方法,而start0是一个本地方法,其底层是C++实现的. public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException();

  • java实现多线程的两种方式继承Thread类和实现Runnable接口的方法

    实现方式和继承方式有什么区别呢? *区别: *继承Thread:线程代码存放在Thread子类run方法中 *实现Runnable:线程代码存放在接口的子类的run方法中 *实现方式的好处:避免了单继承的局限性 *在定义线程时,建议使用实现方式,当然如果一个类没有继承父类,那么也可以通过继承Thread类来实现多线程 *注意:Runnable接口没有抛出异常,那么实现它的类只能是try-catch不能throws *Java对多线程的安全问题提供了专业的解决方式就是同步代码块synchroniz

  • java 实现多线程的方法总结

    java 实现多线程的三种方法 在java中,有三种方法可以实现多线程.第一种方法:继承Thread类,重写run函数.第二种方法:实现Runnable接口,重写run函数.第三种方法:实现Callable接口,重写call函数.本文章将通过实例讲解这三种方法如何实现多线程.需要的可以参考一下.  (1)继承Thread类,重写run函数. class xx extends Thread{ public void run(){ Thread.sleep(1000) //线程休眠1000毫秒,sl

  • Java让多线程按顺序执行的几种方法

    目录 在子线程中通过join()方法指定顺序 在主线程中通过join()方法指定顺序 通过倒数计时器CountDownLatch实现 通过创建单一化线程池newSingleThreadExecutor()实现 文章介绍4种方法,简单易懂,通过4个demo抛砖引玉. 在子线程中通过join()方法指定顺序 通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行.举例:在线程thread2中,加上一句thread1.join(),其意义在于,当前线程2运行到此行代码时会进入阻塞状态,

  • Java 开启多线程常见的4种方法

    目录 简介 1. 实现 Runnable 接口 2. 实现 Callable 接口 3. 继承 Thread 类 4. 匿名内部类的写法 简介 常见的4种使用线程的方法: 1实现 Runnable 接口: 2实现 Callable 接口: 3继承 Thread 类. 4匿名内部类的写法. 1. 实现 Runnable 接口 编写测试类RunnableDemo 实现 Runnable 接口,实现接口中的 run() 方法. public class RunnableDemo implements

  • Java介绍多线程计算阶乘实现方法

    代码运行结果如下: 输入n的值之后,就可以点击开始计算,计算过程中可以暂停计算,也可以停止计算 这是几种线程的操作: 1.sleep方法,线程按时间睡眠,到时间恢复. 2.suspend/resume,暂停/继续方法.Java多线程废弃方法.资源独占,容易发生死锁,脏数据. 3.stop,停止方法,Java多线程废弃方法,线程不安全. 4.wait方法,使得当前线程立刻停止运行,处于等待状态(WAIT),并将当前线程置入锁对象的等待队列中,直到被通知(notify)或被中断为止. 5.notif

  • Java中多线程下载图片并压缩能提高效率吗

    目录 前言 实现思路 实测 前言 需求 导出Excel:本身以为是一个简单得导出,但是每行得记录文件中有一列为图片url,需要下载所有记录行对应得图片,然后压缩整个文件夹. 这里只做4.5.得代码讲解描述,其它也没什么好说得,话不多说上代码. 实现思路 多线程实现使用了线程池,Jdk1.8并发包下的CompletableFuture 第一步:得到基础数值 // 线程数 Integer threadNum = 10; // 每条线程需要处理的图片数 int dataNum = imageInfoV

  • Java实现多线程文件下载的代码示例

    Java实现多线程文件下载思路: 1.基本思路是将文件分段切割.分段传输.分段保存. 2.分段切割用到HttpUrlConnection对象的setRequestProperty("Range", "bytes=" + start + "-" + end)方法. 3.分段传输用到HttpUrlConnection对象的getInputStream()方法. 4.分段保存用到RandomAccessFile的seek(int start)方法. 5

随机推荐