温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

多线程Thread、Runnable以及Callable的实现方式

发布时间:2021-08-24 11:29:21 阅读:129 作者:chen 栏目:开发技术
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章主要讲解了“多线程Thread、Runnable以及Callable的实现方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“多线程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();
        }
    }

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

    多线程Thread、Runnable以及Callable的实现方式

    多线程Thread、Runnable以及Callable的实现方式

    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 th2=new Thread(bf,"售票窗口1");
             Thread th3=new Thread(bf,"售票窗口2");
             Thread th4=new Thread(bf,"售票窗口3");
             Thread th5=new Thread(bf,"售票窗口4");
             th2.start();
             th3.start();
             th4.start();
             th5.start();
        }
    }

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

    多线程Thread、Runnable以及Callable的实现方式

    多线程Thread、Runnable以及Callable的实现方式

    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、Runnable以及Callable的实现方式

    感谢各位的阅读,以上就是“多线程Thread、Runnable以及Callable的实现方式”的内容了,经过本文的学习后,相信大家对多线程Thread、Runnable以及Callable的实现方式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

    亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI

    开发者交流群×