JAVA多线程-多线程实现方式

Posted 河北凝讯科技订阅号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA多线程-多线程实现方式相关的知识,希望对你有一定的参考价值。

JAVA多线程的实现方式。首先在学习JAVA多线程之前我们需要明白几个问题:

  • java 多线程是什么鬼,它和程序、进程之间有什么苟且? 

    • 程序 
      通常而言我们可以将程序定义为是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。

    • 线程 
      是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。线程有就绪、阻塞和运行三种基本状态。

  • 在哪些场景中我们需要用到多线程,多线程有什么优劣势?

    • 优势 

    • 劣势

    • 用户体验更友好,能多并发地完成用户派遣的任务。

    • 提升CPU使用率。

    • 线程过多时在线程切换过程中或消耗系统资源。

    • 程序需要同时执行两个或多个任务。

    • 程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等。

    • 需要一些后台运行的程序时。

    • 应用场景 

    • 优劣势


实现方法

在JAVA 中多线程实现有两种方法:继承Thread 类(最终也是实现Runnable接口)和实现Runnable 接口。

  • 继承Thread类

    • 场景说明 
      开启三个线程来实现三个生产者各自生产100件产品的实现

    • 代码示例

    • 定义子类继承Thread类。

    • 子类中重写Thread类中的run方法。

    • 创建Thread子类对象,即创建了线程对象。

    • 调用线程对象start方法:启动线程,调用run方法。

    • 基本实现步骤

    • 例子

package coreJavaReview.thread;


/**

 * 实现多线程的两种方式

 * 使用继承Thread类的方式实现多线程

 * @author Administrator

 *

 */

public class ThreadCreateByEnxtends {


    public static void main(String[] args) {

        productor1 p1 = new productor1();

        productor2 p2 = new productor2();

        productor3 p3 = new productor3();


        p1.setName("第一个生产者");

        p2.setName("第二个生产者");

        p3.setName("第三个生产者");


        p1.start();

        p2.start();

        p3.start();

    }

}


//第一个生产者在生产

class productor1 extends Thread{

    int i = 0;

    public void run(){

        while(true){

                if(i<100){

                    i++;

                    System.out.println(Thread.currentThread().getName()+":在生产第"+i+"件产品!");

                }else{

                    break;

                }


        }

    }

}

//第二个生产者在生产

class productor2 extends Thread{

    int i = 0;

    public void run(){

        while(true){

            if(i<100){

                i++;

                System.out.println(Thread.currentThread().getName()+":在生产第"+i+"件产品!");

            }else{

                break;

            }

    }

    }   

}

//第三个生产者在生产

class productor3 extends Thread{

    int i =0;


    public void run() {

        while (true) {

            if (i < 100) {

                i++;

                System.out.println(Thread.currentThread().getName() + ":在生产第" + i + "件产品!");

            } else {

                break;

            }

        }

    }

}

实现Runnable接口

  • 基本步骤

    • 定义子类,实现Runnable接口。

    • 子类中重写Runnable接口中的run方法。

    • 通过Thread类含参构造器创建线程对象。

    • 将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法中。

    • 调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。

  • 示例说明

    • 场景说明 
      开启三个线程来实现三个生产者各自生产100件产品的实现

    • 代码示例

    • 例子

package coreJavaReview.thread;


/**

 * 实现多线程的两种方式 使用 实现Runable接口

 * 

 * @author Administrator

 *

 */

public class ThreadCreateByRunable {


    public static void main(String[] args) {

        Productor4 p4 = new Productor4();

        Productor5 p5 = new Productor5();

        Productor6 p6 = new Productor6();


        Thread t4 = new Thread(p4);

        //Thread t5 = new Thread(p4);

        //Thread t6 = new Thread(p4);

        Thread t5 = new Thread(p5);

        Thread t6 = new Thread(p6);


        t4.setName("第一个Tread");

        t5.setName("第二个Tread");

        t6.setName("第三个Tread");


        t4.start();

        t5.start();

        t6.start();

    }


}


// 第一个生产者在生产

class Productor4 implements Runnable {

    int i = 0;


    public void run() {

        while (true) {

            if (i < 100) {

                i++;

                System.out.println(Thread.currentThread().getName() + ":在生产第" + i + "件产品!");

            } else {

                break;

            }


        }

    }

}


//第二个生产者在生产

class Productor5 implements Runnable {

    int i = 0;


    public void run() {

        while (true) {

            if (i < 100) {

                i++;

                System.out.println(Thread.currentThread().getName() + ":在生产第" + i + "件产品!");

            } else {

                break;

            }


        }

    }

}


//第三个生产者在生产

class Productor6 implements Runnable {

    int i = 0;


    public void run() {

        while (true) {

            if (i < 100) {

                i++;

                System.out.println(Thread.currentThread().getName() + ":在生产第" + i + "件产品!");

            } else {

                break;

            }


        }

    }

}

小结

Extends Thread VS Implements Runnable:

  • 继承Thread时线程代码存放Thread子类run方法中。

  • 实现Runnable时线程代码存在接口的子类的run方法。

  • 通常而言我们更建议使Implements Runnable的方式来完成多线程的实现 

    • 避免了单继承的局限性

    • 多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源。(这将关系到线程安全问题,后面的章节我们将会学习到)。

*   版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜


以上是关于JAVA多线程-多线程实现方式的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程基础多线程的实现方式

Java 多线程基础多线程的实现方式

JAVA多线程-多线程实现方式

JAVA多线程实现的三种方式

java多线程系列1-初识多线程多线程4种实现方式

java多线程系列1-初识多线程多线程4种实现方式