多线程Thread,Runnable,Callable实现方式

目录
  • 一、创建线程的常用三种方式
    • 1、继承Thread类
    • 2、实现Runnable接口(重点)
      • 以多个线程并发,解决方法为例
    • 3、 实现Callable接口(JDK1.5版本之后引入的)
  • 总结

一、创建线程的常用三种方式

1、继承Thread类

创建MyThread 类并继承Thread

package com.zrrd.XianCheng;
/**
 *继承Thread类,达到线程的能力
 */
public class MyThread extends Thread{
    private String name;
    public MyThread(String name){
         this.name=name;
    }
    @Override
    public void run() {
          for(int i=0;i<=100;i++){
              System.out.println(name+"下载了"+i+"%");
          }
    }
}

创建测试类ThreadText 启动线程,执行代码块

package com.zrrd.XianCheng;
/**
 * 测试线程代码
 */
public class ThreadText {
    public static void main(String[] args) {
        //创建一个线程对象
         MyThread my=new MyThread( "A线程");
         //启动线程start()
         my.start();
        //创建第二个线程对象
        MyThread my1=new MyThread("B线程");
        //启动线程start()
        my1.start();
    }
}

执行结果图片,截取部分结果集

2、实现Runnable接口(重点)

以多个线程并发,解决方法为例

**创建BingFa 类并实现Runnable **

package com.zrrd.XianCheng;
/**
 * 多个线程并发,解决方法
 */
public class BingFa implements Runnable {
    int piaoshu=50;
    Object obj=new Object();
    @Override
    public void run() {
        /* 同步代码块用synchronized修饰*/
        while (true){
          synchronized (obj){//发生阻塞事件
                   if(piaoshu>0){
                       System.out.println(Thread.currentThread().getName()+"剩余"+(piaoshu--)+"张");
                   }else{
                       break;
                   }
             }
              try {
                  Thread.sleep(200);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
        System.out.println(Thread.currentThread().getName()+"结束售票");
    }
}

创建测试类BingFaText启动线程,执行代码块

package com.zrrd.XianCheng;
import java.lang.Thread;
public class BingFaText {
    public static void main(String[] args) {
         BingFa bf=new BingFa();
         Thread th1=new Thread(bf,"售票窗口1");
         Thread th2=new Thread(bf,"售票窗口2");
         Thread th3=new Thread(bf,"售票窗口3");
         Thread th4=new Thread(bf,"售票窗口4");
         th1.start();
         th2.start();
         th3.start();
         th4.start();
    }
}

执行结果图片,截取部分结果集

3、 实现Callable接口(JDK1.5版本之后引入的)

创建MyCallable类并实现Callable<T>

package com.zrrd.XianCheng;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {//多线程主体类
    private int ticket=5;                     //线程共享资源
    @Override
    public String call() throws Exception {
            for (int i=0;i<100;i++){
                if(this.ticket>0){
                    System.out.println("卖票,ticket="+this.ticket--);
                }
            }
        return "票已卖光!";        //返回结果
    }
}

创建测试类MyCallableDemo启动线程,执行代码块

package com.zrrd.XianCheng;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class MyCallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable callable1 = new MyCallable();//创建多线程实例1
        MyCallable callable2 = new MyCallable();//创建多线程实例2
        FutureTask task1 = new FutureTask<String>(callable1);
        FutureTask task2 = new FutureTask<String>(callable2);
        //FutureTask 是Runnable接口的子类,所以可以使用Thread类的构造方法来接收task对象
        new Thread(task1).start();
        new Thread(task2).start();
        System.out.println("A______"+task1.get());
        System.out.println("B______"+task2.get());
    }
}

执行结果图片

总结

以上就是实现多线程的方式,在实际开发项目中不建议使用第一种继承Thread方式实现线程,这样对代码的侵入性太高,而且类与类之间单继承,达不到代码重用规则,建议使用第二种、或第三种。

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

(0)

相关推荐

  • 一篇文章带你了解Java中ThreadPool线程池

    目录 ThreadPool 线程池的优势 线程池的特点 1 线程池的方法 (1) newFixedThreadPool (2) newSingleThreadExecutor (3) newScheduledThreadPool (4) newCachedThreadPool 2 线程池底层原理 3 线程池策略及分析 拒绝策略 如何设置maximumPoolSize大小 ThreadPool 线程池的优势 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些

  • Java Thread之Sleep()案例详解

    一.API简介 Thread.sleep()是Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断,将会抛出IterruptedException中断异常..主要方法如下: [a]sleep(long millis)  线程睡眠 millis 毫秒 [b]sleep(long millis, int nanos)  线程睡眠 millis 毫秒 + nanos 纳秒 Api文档: 二.使用方法 注意:在哪个线程里面调用sleep()方法就阻塞哪个线程.

  • Java并发教程之Callable和Future接口详解

    刚把Thread 的知识理了一遍. Runnable是一个接口,而Thread是Runnable的一个实现类. 所以也就有了之前创建线程的两种方法 继承Thread 实现Runnable 我们看一下新建线程的方法: 都是得传入一个Runnable对象(这句话很关键) 所以传入一个Runnble和Thread对象都行. 现在引入创建线程的第三种方法:Callable 为了实现 Runnable,需要实现不返回任何内容的 run()方法,而对于 Callable,需要实现在完成时返回结果的 call

  • 多线程_解决Runnable接口无start()方法的情况

    为什么需要定一个类去实现Runnable接口呢?继承Thread类和实现Runnable接口有啥区别呢? 实现Runnable接口,避免了继承Thread类的单继承局限性.覆盖Runnable接口中的run方法,将线程任务代码定义到run方法中. 创建Thread类的对象,只有创建Thread类的对象才可以创建线程.线程任务已被封装到Runnable接口的run方法中,而这个run方法所属于Runnable接口的子类对象,所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建

  • Android HandlerThread案例详解

    HandlerThread 顾名思义就是一种可以使用 Handler 的 Thread.日常开发中我们经常会通过创建一个 Thread 去执行任务,有多个任务就多创建几个线程实现,这时候可能出现线程同步的问题.不过有时候我们并不需要很强的并发性,只需保证按照顺序地执行各个任务即可,有什么好办法实现呢?第一反应想到的可能是通过 Executors.newSingleThreadExecutor() 方法来创建一个 SingleThreadExecutor,来统一所有的任务到一个线程中,然后按顺序执

  • 多线程Thread,Runnable,Callable实现方式

    目录 一.创建线程的常用三种方式 1.继承Thread类 2.实现Runnable接口(重点) 以多个线程并发,解决方法为例 3. 实现Callable接口(JDK1.5版本之后引入的) 总结 一.创建线程的常用三种方式 1.继承Thread类 创建MyThread 类并继承Thread package com.zrrd.XianCheng; /** *继承Thread类,达到线程的能力 */ public class MyThread extends Thread{ private Strin

  • Java 线程对比(Thread,Runnable,Callable)实例详解

    Java 线程对比Thread,Runnable,Callable java 使用 Thread 类代表线程,所有现场对象都必须是 Thread 类或者其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流.java 使用线程执行体来代表这段程序流. 1.继承Thread 类创建线程 启动多线程的步骤如下: (1)定义Thread 类的子类,并重写该类的run() 方法,该run() 方法的方法体就代表类线程需要完成的任务.因此把run() 方法称为线程执行体. (2)创建 Th

  • Java多线程实现Runnable方式

    本文为大家分享了Java多线程实现Runnable方式的具体方法,供大家参考,具体内容如下 (一)步骤 1.定义实现Runnable接口 2.覆盖Runnable接口中的run方法,将线程要运行的代码存放在run方法中. 3.通过Thread类建立线程对象. 4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数. 为什么要讲Runnable接口的子类对象传递给Thread的构造方法.因为自定义的方法的所属的对象是Runnable接口的子类对象. 5.调用Thread类的

  • java 多线程Thread与runnable的区别

    java 多线程Thread与runnable的区别 java中实现多线程的方法有两种:继承Thread类和实现runnable接口 1,继承Thread类,重写父类run()方法 public class thread1 extends Thread { public void run() { for (int i = 0; i < 10000; i++) { System.out.println("我是线程"+this.getId()); } } public static

  • JAVA多线程Thread和Runnable的实现

    java中只允许单一继承,但允许实现多个接口,因此第二种方法更灵活. 复制代码 代码如下: /**     * 运行继承java.lang.Thread类定义的线程     */    public void startOne() {        // 创建实例        OneThread oneThread = new OneThread();        // 启动线程ThreadA        oneThread.startThreadA();        try {    

  • 详细解读JAVA多线程实现的三种方式

    最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结. 1.继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法.start()方法是一个native方法,它将启动一个新线程,并执行run()方法.这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run(

  • 简单了解Java多线程实现的四种方式

    第一种方式为继承Thread类然后重写run方法再调用start方法,因为java为单继承多实现,所以不建议使用这种方式,代码如下: public class Demo extends Thread{ public static void main(String[] args) { new Demo().start(); } @Override public void run() { System.out.println("继承Thread类实现多线程"); } } 第二种为实现Run

  • Java多线程三种主要实现方式解析

    多线程三种主要实现方式:继承Thread类,实现Runnable接口.Callable和Futrue. 一.简单实现 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; public class T02_HowToCreat

  • Java基础之多线程的三种实现方式

    一.前言 Java多线程实现的三种方式有继承Thread类,实现Runnable接口,使用ExectorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的. 二.继承Thread类实现多线程 1.Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法. 2.start()方法是一个native方法,它将启动一个新线程

  • Java中线程Thread的三种方式和对比

    介绍 多线程主要的作用就是充分利用cpu的资源.单线程处理,在文件的加载的过程中,处理器就会一直处于空闲,但也被加入到总执行时间之内,串行执行切分总时间,等于每切分一个时间*切分后字符串的个数,执行程序,估计等几分钟能处理完就不错了.而多线程处理,文件加载与差分过程中 一.Java实现多线程的三种方式 1.继承Thread 通过Thread继承,并重写run方法来实现多线程,案例如下: public class ThreadPattern extends Thread { @Override p

随机推荐