Jadual Kandungan
什么是线程:
多线程(并行和并发)
多线程(java程序运行的原理)
启动jvm是单线程的么?
java中如何创建多线程
(1)继承Thread类并调用start方法
(2)实现runnable接口,并重写run方法
实现Callable接口
继承Thread,实现Runnable和Callable的区别
从源码的实现上
继承Thread
实现Runnable
从使用上和拓展上
实现Callable
Rumah Java javaTutorial java中的多线程如何创建?(详细)

java中的多线程如何创建?(详细)

Sep 25, 2018 pm 03:32 PM
java multithreading

本篇文章给大家带来的内容是关于java中的多线程如何创建?(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

什么是线程:

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源

表面上是多线程其实是cpu快速轮流切执行

多线程(并行和并发)

  1. 并行:两个任务同事进行,就是甲任务执行的同时,乙任务也在执行(需要多核)

  2. 并发:两个任务都请求运行,而处理器只能接受一个任务,就把这两个任务安排轮流执行。由于时间间隔很短,使人感觉两个任务都在运行

多线程(java程序运行的原理)

java命令会启动jvm等于启动了一个应用程序(一个进程)。该进程会自动启动“主线程”,主线程去调用main方法

启动jvm是单线程的么?

不是,是多线程的。至少会启动垃圾回收线程和主线程

可通过下面代码来验证,主线程和垃圾回收线程在互相抢占资源

public class TestThread {

    public static void main(String[] args) {
        //4.创建Thread的子类对象
        MyThread myThread = new MyThread();

        //5.启动线程,注意这里使用的是start而不是run方法
        myThread.start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }


}

//1.继承Thread
class MyThread extends  Thread{

    //2.重写run方法
    @Override
    public void run() {
        super.run();
        //3.线程方法中要执行的代码,可以根据自己的需求填写
        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyThread thread ");
        }
    }
}
Salin selepas log masuk

java中如何创建多线程

(1)继承Thread类并调用start方法

Thread实现了Runnable接口
要实现多线程,就要成为thread的子类,并且重写run方法。注意在启动线程的时候,调用的不是run方法而是start方法。如果调用run方法,那么相当于一个普通方法并不会开启线程

public class Thread implements Runnable
Salin selepas log masuk
public class TestThread {

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        //注意这里使用的是start而不是run方法
        myThread.start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }
}
class MyThread extends  Thread{
    @Override
    public void run() {
        super.run();

        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyThread thread ");
        }
    }
}
Salin selepas log masuk

(2)实现runnable接口,并重写run方法

Runnable中只有一个方法run(),而线程启动方法存在与Thread中,
那么我们在最终启动线程的时候,势必是要通过Thread的子类对象去启动线程的

public class TestRunnable {

    public static void main(String[] args) {
        //4.创建Thread的子类对象
        Runnable myRunnable = new MyRunnable();

        //5.启动线程,创建Thread并把runnable的子类作为构造参数
        new Thread(myRunnable).start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }

}
//1.实现runnable接口
class MyRunnable implements Runnable {

    //2.重写run方法
    @Override
    public void run() {
        //3.线程方法中要执行的代码,可以根据自己的需求填写
        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyRunnable thread ");
        }
    }
}
Salin selepas log masuk

实现Callable接口

要实现线程,除了继承thread和runnable,还可以实现Callable接口。Callable接口提供了一个call()方法可以作为线程执行体,和run()的作用一样。但call()方法比run()方法多了返回值,call()方法可以声明抛出的异常。那么我们如何开启Callable线程呢?因为Callable接口不是Runnable接口的子接口,所以Callable对象不能作为Thread的构造参数。Java提供了另一个接口RunnableFuture接口,该接口实现了Runnable, Future

  1. 实现Callable接口

  2. 重写call方法,相当于thread中的run方法。不同的是call方法允许有返回值

  3. 把Callable实现类对象作为构造参数传入FutureTask创建FutureTask对象。

  4. 把FutureTask对象作为构造参数传入Thread,并开启线程

public class CallableDemo {

    public static void main(String[] args) {
        //3.把Callable实现类对象作为构造参数传入FutureTask创建FutureTask对象。
        FutureTask<UUID> futureTask = new FutureTask<UUID>(new MyCallable());
        //4.把FutureTask对象作为构造参数传入Thread,并开启线程
        new Thread(futureTask).start();
        try {
            System.out.println(futureTask.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

//1. 实现**Callable**接口
class MyCallable implements Callable<UUID> {

    //2.重写**call**方法,相当于thread中的run方法。不同的是call方法允许有返回值
    @Override
    public UUID call() throws Exception {
        //生成随机数
        return UUID.randomUUID();
    }
}
Salin selepas log masuk

继承Thread,实现Runnable和Callable的区别

从源码的实现上

继承Thread

子类重写Thread中的run()方法,调用start()方法,jvm会自动调用子类的run()

实现Runnable

new Thread(myRunnable)在Thread的构造函数中参入runnable的引用,然后传给thread的成员变量target。在Thread run()方法中判断了如果target不为空,就调用子类的run方法

    public void run() {
    if (this.target != null) {
        this.target.run();
    }
Salin selepas log masuk

实现Callable接口

实现Callable接口重写Call()方法,并且可以提供线程返回值,也可以抛出异常。最终通过Runnable的子接口RunnableFuture的实现类FutureTask,传给Thread的成员变量target。

从使用上和拓展上

继承Thread

  1. 优点:直接调用thread中的start()方法,十分简单

  2. 缺点:java只支持单继承,如果子类继承了thread无法再继承其他类

实现Runnable

  1. 优点:java可以多实现

  2. 缺点:代码书写比较复杂,不能直接调用start()

实现Callable

  1. 优点:java可以多实现,可以抛出异常,可以有返回值

  2. 缺点:代码书写比较复杂

Atas ialah kandungan terperinci java中的多线程如何创建?(详细). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Kaedah pengoptimuman pembangunan Java untuk prestasi pecutan berbilang benang membaca fail Kaedah pengoptimuman pembangunan Java untuk prestasi pecutan berbilang benang membaca fail Jun 30, 2023 pm 10:54 PM

Dalam pembangunan Java, membaca fail adalah operasi yang sangat biasa dan penting. Apabila perniagaan anda berkembang, begitu juga saiz dan bilangan fail. Untuk meningkatkan kelajuan membaca fail, kita boleh menggunakan multi-threading untuk membaca fail secara selari. Artikel ini akan memperkenalkan cara mengoptimumkan prestasi pecutan berbilang benang membaca fail dalam pembangunan Java. Pertama, sebelum membaca fail, kita perlu menentukan saiz dan kuantiti fail. Bergantung pada saiz dan bilangan fail, kami boleh menetapkan bilangan utas dengan munasabah. Bilangan benang yang berlebihan boleh mengakibatkan sumber terbuang,

Penjelasan terperinci tentang senario penggunaan dan fungsi kata kunci yang tidak menentu dalam Java Penjelasan terperinci tentang senario penggunaan dan fungsi kata kunci yang tidak menentu dalam Java Jan 30, 2024 am 10:01 AM

Penjelasan terperinci tentang peranan dan senario aplikasi kata kunci yang tidak menentu dalam Java 1. Peranan kata kunci yang tidak menentu Dalam Java, kata kunci yang tidak menentu digunakan untuk mengenal pasti pembolehubah yang boleh dilihat di antara beberapa utas, iaitu, untuk memastikan keterlihatan. Khususnya, apabila pembolehubah diisytiharkan tidak menentu, sebarang pengubahsuaian pada pembolehubah itu akan diketahui dengan serta-merta oleh rangkaian lain. 2. Senario Aplikasi Bendera Status Kata Kunci Meruap Kata kunci tidak menentu sesuai untuk beberapa senario bendera status, seperti

Terokai prinsip kerja dan ciri java multithreading Terokai prinsip kerja dan ciri java multithreading Feb 21, 2024 pm 03:39 PM

Terokai prinsip kerja dan ciri Java multithreading Pengenalan: Dalam sistem komputer moden, multithreading telah menjadi kaedah biasa pemprosesan serentak. Sebagai bahasa pengaturcaraan yang berkuasa, Java menyediakan mekanisme multi-threading yang kaya, membolehkan pengaturcara menggunakan pemproses berbilang teras komputer dengan lebih baik dan meningkatkan kecekapan menjalankan program. Artikel ini akan meneroka prinsip kerja dan ciri-ciri berbilang benang Java dan menggambarkannya dengan contoh kod khusus. 1. Konsep asas multi-threading Multi-threading merujuk kepada melaksanakan berbilang thread pada masa yang sama dalam program, dan setiap thread memproses berbeza

Pengendalian pengecualian dalam persekitaran berbilang benang Java Pengendalian pengecualian dalam persekitaran berbilang benang Java May 01, 2024 pm 06:45 PM

Perkara utama pengendalian pengecualian dalam persekitaran berbilang benang: Pengecualian menangkap: Setiap utas menggunakan blok cuba-tangkap untuk menangkap pengecualian. Kendalikan pengecualian: cetak maklumat ralat atau lakukan logik pengendalian ralat dalam blok tangkapan. Tamatkan utas: Apabila pemulihan adalah mustahil, panggil Thread.stop() untuk menamatkan utas. UncaughtExceptionHandler: Untuk mengendalikan pengecualian yang tidak ditangkap, anda perlu melaksanakan antara muka ini dan menetapkannya pada urutan. Kes praktikal: pengendalian pengecualian dalam kumpulan benang, menggunakan UncaughtExceptionHandler untuk mengendalikan pengecualian yang tidak ditangkap.

Panduan Pengoptimuman Prestasi Java Multithreading Panduan Pengoptimuman Prestasi Java Multithreading Apr 11, 2024 am 11:36 AM

Panduan Pengoptimuman Prestasi Berbilang Benang Java menyediakan lima titik pengoptimuman utama: Kurangkan penciptaan benang dan overhed pemusnahan Elakkan pertikaian kunci yang tidak sesuai Gunakan struktur data tidak menyekat Leverage Berlaku-Sebelum perhubungan Pertimbangkan algoritma selari tanpa kunci

Penjelasan terperinci tentang kunci serentak berbilang benang Java Penjelasan terperinci tentang kunci serentak berbilang benang Java Apr 11, 2024 pm 04:21 PM

Mekanisme kunci konkurensi Java memastikan sumber yang dikongsi diakses oleh hanya satu utas dalam persekitaran berbilang benang. Jenisnya termasuk penguncian pesimis (peroleh kunci dan kemudian akses) dan penguncian optimistik (semak konflik selepas mengakses). Java menyediakan kelas kunci konkurensi terbina dalam seperti ReentrantLock (kunci mutex), Semaphore (semaphore) dan ReadWriteLock (kunci baca-tulis). Menggunakan kunci ini boleh memastikan akses selamat benang kepada sumber yang dikongsi, seperti memastikan bahawa apabila berbilang rangkaian mengakses pembilang pembolehubah dikongsi pada masa yang sama, hanya satu utas mengemas kini nilainya.

Isu keselamatan berbilang benang dalam Java - penyelesaian kepada java.lang.ThreadDeath Isu keselamatan berbilang benang dalam Java - penyelesaian kepada java.lang.ThreadDeath Jun 25, 2023 am 11:22 AM

Java ialah bahasa pengaturcaraan yang digunakan secara meluas dalam pembangunan perisian moden, dan keupayaan pengaturcaraan berbilang benangnya juga merupakan salah satu kelebihan terbesarnya. Walau bagaimanapun, disebabkan masalah akses serentak yang disebabkan oleh berbilang benang, isu keselamatan berbilang benang sering berlaku di Jawa. Antaranya, java.lang.ThreadDeath ialah isu keselamatan berbilang benang biasa. Artikel ini akan memperkenalkan punca dan penyelesaian java.lang.ThreadDeath. 1. Sebab untuk java.lang.ThreadDeath

Teknologi penyahpepijatan berbilang benang Java didedahkan Teknologi penyahpepijatan berbilang benang Java didedahkan Apr 12, 2024 am 08:15 AM

Jawapan teknologi penyahpepijatan berbilang benang: 1. Cabaran dalam penyahpepijatan kod berbilang benang: Interaksi antara utas membawa kepada tingkah laku yang kompleks dan sukar untuk dikesan. 2. Teknologi penyahpepijatan berbilang benang Java: pembuangan benang penyahpepijatan baris demi baris (jstack) pantau kemasukan dan keluar acara pembolehubah setempat 3. Kes praktikal: gunakan pembuangan benang untuk mencari jalan buntu, gunakan peristiwa monitor untuk menentukan punca kebuntuan. 4. Kesimpulan: Teknologi penyahpepijatan berbilang benang yang disediakan oleh Java boleh menyelesaikan masalah yang berkaitan dengan keselamatan benang, kebuntuan dan perbalahan dengan berkesan.

See all articles