首页 > 编程语言 >Java多线程入门

Java多线程入门

时间:2024-07-18 18:53:22浏览次数:9  
标签:Java 入门 Thread void start 线程 new 多线程 public

创建线程的三种方式


继承Thread类

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + " " + i);
        }
    }

    public static void main(String[] args) {
        new MyThread().start();
        new MyThread().start();
        new MyThread().start();
    }
}

实现Runnable接口

class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        new Thread(myRunnable, "T1").start();
        new Thread(myRunnable, "T2").start();
        new Thread(myRunnable, "T3").start();
    }
}

实现Callable接口

class CallerTask implements Callable<String> {

    @Override
    public String call() throws Exception {
        return "回调结果";
    }

    public static void main(String[] args) {
        // 创建异步任务
        FutureTask<String> task = new FutureTask<>(new CallerTask());
        // 启动线程
        new Thread(task).start();
        try {
            // 等待执行完成,并获取返回结果
            String result = task.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}
  • run():封装线程执行的代码,直接调用相当于调用普通方法。

  • start():启动线程,然后由 JVM 调用此线程的 run() 方法。

  • 实现 Runnable 接口避免了 Java 单继承的局限性,Java 不支持多重继承,因此如果我们的类已经继承了另一个类,就不能再继承 Thread 类了。并且适合多个相同的程序代码去处理同一资源的情况,把线程、代码和数据有效的分离,更符合面向对象的设计思想。Callable 接口与 Runnable 非常相似,但可以返回一个结果。

控制线程的其他方法

  • sleep():使当前正在执行的线程暂停指定的毫秒数,也就是进入休眠的状态。

  • join():等待这个线程执行完才会轮到后续线程得到 cpu 的执行权。

public static void main(String[] args) {
    MyRunnable myRunnable = new MyRunnable();
    Thread t1 = new Thread(myRunnable, "T1");
    t1.start();

    try {
        // t1执行完才会轮到后面的线程执行
        t1.join();
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    new Thread(myRunnable, "T2").start();
    new Thread(myRunnable, "T3").start();
}
  • setDaemon():将此线程标记为守护线程,准确来说,就是服务其他的线程,像 Java 中的垃圾回收线程,就是典型的守护线程。

  • yield():yield() 方法是一个静态方法,用于暗示当前线程愿意放弃其当前的时间片,允许其他线程执行。然而,它只是向线程调度器提出建议,调度器可能会忽略这个建议。具体行为取决于操作系统和 JVM 的线程调度策略。

class YieldExample {
    public static void main(String[] args) {
        Thread thread1 = new Thread(YieldExample::printNumbers, "刘备");
        Thread thread2 = new Thread(YieldExample::printNumbers, "关羽");

        thread1.start();
        thread2.start();
        /*
            关羽 让出控制权...
            刘备 让出控制权...
            关羽: 3
            关羽: 4
            关羽 让出控制权...             // 即便有时候让出了控制权,其他线程也不一定会执行
            关羽: 5
            刘备: 3
            刘备: 4
            刘备 让出控制权...
            刘备: 5
         */
    }

    private static void printNumbers() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);

            // 当 i 是偶数时,当前线程暂停执行
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + " 让出控制权...");
                Thread.yield();
            }
        }
    }
}

线程的生命周期

标签:Java,入门,Thread,void,start,线程,new,多线程,public
From: https://www.cnblogs.com/sprinining/p/18310244

相关文章

  • 基于Python语言的入门算法和数据结构(持续更新中,求关注一波)[链表 栈 队列 复杂度 操作]
    这篇文章主要是讲的Python语言的算法,本人还在不断记笔记中,文章也会持续更新,内容比较浅薄,请大家指教另外推荐一个比较好用的记笔记的软件Typora,自己已经使用很久了,感觉不错。。。虽然但是还是有欠缺。目录第一章算法概述1.1什么是数据结构?01数据结构都有哪些组成方式02......
  • 多线程三-线程安全之可见性与有序性
    volatile关键字来确保线程间的可见性,可以利用线程可见性在某些场景进行无锁化编程。下载Hotspot源码:官网:https://openjdk.org/左侧菜单,SourceCode下面的Mecurial点击jdk8点击hotspot点击zipvolatile关键字来确保线程间的可见性,可以利用线程可见性在某些场景进行无锁化......
  • java-算数运算符
    ##6.6.1算数运算符|运算符|运算|范例|结果||------------|------------|------------|------------||+ | 正号 | +300 | 300| - | 负号 | b=4;-b | -4|||||| |+ | 加 | 5+5 | 10 || - | 减 | 7-4 | 3| ||||| |* | 乘 | 3*4 | 12|| / | 除......
  • 1.java编写命令
    #六java编写命令**第一步:先写注释(需求、思路),进行需求分析和设计**```需求:定义一个helloword小程序思路: 1.通过class关键字定义一个类,将代码编写到该类中 2.为了保证该类的独立运行,在类定义个主函数,格式publicstaticvoidmain{String[]args} 3.保存成一个扩展名为ja......
  • Javase-8.数组的练习
    1.查找数组中指定元素(二分查找)以升序数组为例,二分查找的思路是先取中间位置的元素,然后使用待查找元素与数组中间元素进行比较:如果相等,即找到了返回该元素在数组中的下标如果小于,以类似方式到数组左半侧查找如果大于,以类似方式到数组右半侧查找pub......
  • 2.java-注释
    ##6.1java的三种注释方式,方便用来调试程序。 ```注意:多行注释中不可以再有多行注释。 单行注释中可以有再有单行注释。 多行注释中可以再有单行注释```**注释添加的位置**``` 类上面添加文档注释 主函数上面添加多行注释 代码当中几乎话难懂会加单行注......
  • JavaWeb笔记_Response对象
    一.Response对象1.1Response对象概述a.专门负责给浏览器响应信息(响应行,响应头,响应体)的对象b.我们主要使用的是跟HTTP协议相关的Response对象:HTTPServletResponse,继承了ServletResponse,扩展了ServletResponse接口,提供了更多的方法,例如可以操作响应头,cookie等1.2Response......
  • 5.java命令程序介绍
    五java命令程序介绍 javac 编译工具:将原文件编译成计算机可以识别的语言 格式: javachello-world.java 执行完该命令后,在源文件的目录下会生成一个新的class文件,称之为运行文件 java 调用虚拟机(JVM)运行java的class文件(可执行文件名称) 格式: java+字节码文件......
  • 4.java程序开发体验-hello-World
    四java程序开发体验--helloworldjava代码格式:有开始(class)---区间({})有结尾()1.将java代码编写到扩展名为.java的文件中去。编写源文件classdemo{ publicstaticvoidmain(String[]args) { System.out.print("hellojava"); }}2.通过javac命令对该java文件进......
  • 3.java-环境搭建
    三java语言的环境搭建1.了解JREJDK JRE(javaruntimeenvironmentjava运行环境) 包括java虚拟机(JVM)和java程序所需的核心类库等,如果想要一个开发好的java程序,计算机中只需要安装JRE即可。 JDK(javadevelopmentkitjava开发工具包) jdk是提供给java开发人员使用的,其中包含......