详解Java线程的创建及休眠

 更新时间:2021年06月11日 08:43:21   作者:MercuryG  
今天带大家学习的是Java的相关知识,文章围绕着Java线程的创建及休眠展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

一、进程vs线程

  • 1、进程是系统分配资源的最小单位;线程是系统调度的最小单位
  • 2、一个进程中至少要包含一个线程
  • 3、线程必须要依附于继承,线程是进程实质工作的一个最小单位

二、线程的创建方式

继承Thread类 实现线程的创建(2种写法)

1种写法

public class ThreadDemo03 {

    static  class MyThread extends Thread{
        @Override
        public void run(){
            System.out.println("线程名称:" +
                    Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        // 创建了线程
        Thread t1 = new MyThread();
        // 启动线程
        t1.start();
        System.out.println("当前线程的名称(主线程):" +
                Thread.currentThread().getName());
    }
}

2种写法

public class ThreadDemo04 {
    public static void main(String[] args) {
        
        Thread thread = new Thread(){
            @Override
            public void run() {
                System.out.println("线程名:" +
                        Thread.currentThread().getName());
            }
        };
        thread.start();
        
    }
}

继承Thread类的创建方式的缺点:在Java语言设计当中只能实现单继承,如果继承了Thread类,就不能继承其他类了,所以这种创建方式在开发中使用。

三、实现Runnable接口的方式(3种)

在Java中不能实现多继承,但是可以实现多接口

1种方法

public class ThreadDemo05 {
    static class MyRunnable implements Runnable{
        @Override
        public void run() {
            System.out.println("线程名:" +
                    Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        // 1、新建Runnable类
        MyRunnable runnable = new MyRunnable();

        // 2、新建Thread
        Thread thread = new Thread(runnable);

        // 3、启动线程
        thread.start();
    }
}

2种方法

public class ThreadDemo06 {
    public static void main(String[] args) {

        // 匿名内部类的方式实现线程

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程名:" +
                        Thread.currentThread().getName());
            }
        });
        thread.start();
    }
}

3种方法

/**
 * 使用拉姆达表达式的方式创建
 * **/
public class ThreadDemo07 {
    public static void main(String[] args) {
        Thread thread  = new Thread(() -> {
            System.out.println("线程名: "+ 
                    Thread.currentThread().getName());
        });
        thread.start();
    }
}

四、实现Callable接口的方式(1种)

为了拿到执行完线程后可以得到返回值的方法

package Thread;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 创建并得到线程执行的结果
 * 实现Callable 接口  + Future容器 的方式
 * */


public class ThreadDemo08 {

    static class MyCallable implements Callable<Integer >{ // 想要返回的是Integer类型

        @Override
        public Integer call() throws Exception {

            // 生成一个随机数
            int num = new Random().nextInt(10);
            System.out.println("子线程:" +
                    Thread.currentThread().getName() +
                    "随机数:" + num);
            return num;
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1、创建一个Callable
        MyCallable myCallable = new MyCallable();

        // 2、创建一个FutureTask 对象来接受返回值
        FutureTask<Integer> futureTask =
                new FutureTask<>(myCallable);
        // 3、创建Thread
        Thread thread = new Thread(futureTask);

        // 启动线程
        thread.start();

        // 得到线程执行结果
        int result = futureTask.get();
        System.out.println(String.format("线程名:%s,数字:%d",
                Thread.currentThread().getName(), result));
    }
}

五、线程的休眠

  • 1、Thread.sleep()
  • 2、TimeUnit.SECONDS.sleep(1)休眠一秒钟
  • 其中可选的有DAYS表示天,HOURS表示小时
  • 3、Thread.sleep(TimeUnit.SECONDS.toMillis(1))

练习:使用连个线程来打印“AABBCCDD”,一个线程只能打印"ABCD"

package Thread;

public class ThreadDemo09 {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                String data = "ABCD";
                for (char item:data.toCharArray()) {
                    System.out.print(item);
                    try {
                        // 休眠一段时间
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };

        Thread t1 = new Thread(runnable);
        Thread t2 = new Thread(runnable);
        t1.start();
        t2.start();
    }

}

六、线程优先级

默认优先级为5

最小优先级为1

最大优先级为10

优先级越大那么它的执行权重越高

理论上优先级越高,执行权限也就越大,但是CPU的调度实很复杂的,所以不会严格按照优先级的排序去执行,但总体还是优先级越高,执行权重越高

七、守护线程

守护线程使用场景:Java垃圾回收器、TCP的健康检测

守护线程需要注意的事项:

  •  1、守护线程必须设置在Thread.start()之前,如果设置守护线程再开始线程之后,那么程序就会报错,并且设置的守护线程值不能生效
  • 2、在守护线程t1内部创建一个新的线程t2,此时t2默认情况下也是守护线程

到此这篇关于详解Java线程的创建及休眠的文章就介绍到这了,更多相关Java线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring IOC容器的Bean管理基于注解属性注入方式

    Spring IOC容器的Bean管理基于注解属性注入方式

    这篇文章主要为大家介绍了Spring IOC容器的Bean管理基于注解属性注入方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • MyBatis使用<foreach>标签报错问题及解决

    MyBatis使用<foreach>标签报错问题及解决

    这篇文章主要介绍了MyBatis使用<foreach>标签报错问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • springmvc重定向实现方法解析

    springmvc重定向实现方法解析

    这篇文章主要介绍了springmvc重定向实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java 自定义Spring框架与Spring IoC相关接口分析

    Java 自定义Spring框架与Spring IoC相关接口分析

    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发
    2021-10-10
  • Java项目中大批量数据查询导致OOM的解决

    Java项目中大批量数据查询导致OOM的解决

    本文主要介绍了Java项目中大批量数据查询导致OOM的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 深入理解注解与自定义注解的一些概念

    深入理解注解与自定义注解的一些概念

    今天给大家带来的文章是注解的相关知识,本文围绕着注解与自定义注解的一些概念展开,文中详细介绍了这些知识,需要的朋友可以参考下
    2021-06-06
  • java 异常捕获及处理案例详解

    java 异常捕获及处理案例详解

    这篇文章主要介绍了java 异常捕获及处理案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Java 汇编JVM编写jasmin程序的操作方法

    Java 汇编JVM编写jasmin程序的操作方法

    这篇文章主要介绍了Java 汇编JVM编写jasmin程序的操作方法,本文通过几个示例讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • plsql实现DES对称加密 Java解密

    plsql实现DES对称加密 Java解密

    这篇文章主要介绍了plsql实现DES对称加密 Java解密的方法,帮助大家更好的理解和学习使用Oracle与Java,感兴趣的朋友可以了解下
    2021-02-02
  • Java中加锁的方式代码示例

    Java中加锁的方式代码示例

    这篇文章主要给大家介绍了关于Java中加锁方式的相关资料,我们平时开发的过程中难免遇到多线程操作共享资源的时候,这时候一般可以通过加锁的方式保证操作的安全性,需要的朋友可以参考下
    2023-09-09

最新评论