美文网首页
多线程基础1:创建线程的三种方式

多线程基础1:创建线程的三种方式

作者: 赶路人_3864 | 来源:发表于2019-04-22 13:23 被阅读0次

前言

创建线程有三种方式:

1.继承Thread

  1. 实现Runnable
  2. 实现Callable

具体代码

1.继承Thread:继承这种方式不推荐用,因为继承Thread之后便不能继承其他类,导致很局限

    public void run(){//线程入口点
        for(int i=0;i<20;i++)
        System.out.println("啦啦啦");
    }
    public static void main(String[] args) {
        Thread01 st=new Thread01();
        st.start();//不一定立刻运行。由cpu决定
        for(int i=0;i<20;i++)
            System.out.println("插队插队");

    }
}

2.实现Runnable:推荐使用方式

    public void run(){//线程入口点
        for(int i=0;i<20;i++)
            System.out.println("啦啦啦");
    }
    public static void main(String[] args) {
        Thread01 st=new Thread01();
        Thread t=new Thread(st);//代理类对象
        t.start();//不一定立刻运行。由cpu决定
        for(int i=0;i<20;i++)
            System.out.println("插队插队");

    }
}

用第二种方式模仿抢票和龟兔赛跑:

抢票:(此处并发问题将在后期的文章讲解)


package thread;

public class Ticket_garbbing implements Runnable{
    private int tickrtSize=100;
    @Override
    public void run() {
        while(true) {
            if (tickrtSize < 0) {
                break;
            }
            try {
                Thread.sleep(200);//模仿网络延时此时出现负数出现并发问题
            } catch (InterruptedException e) {//并发需要保证线程安全
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"/"+tickrtSize--);
        }
    }

    public static void main(String[] args) {
        Ticket_garbbing tg1=new Ticket_garbbing();

        new Thread(tg1,"io1").start();
        new Thread(tg1,"io2").start();
        new Thread(tg1,"io3").start();
        new Thread(tg1,"io4").start();
        new Thread(tg1,"io5").start();
        new Thread(tg1,"io6").start();
    }
}

龟兔赛跑:


package thread;
/*
* 龟兔赛跑
* */
public class Racter implements Runnable{
    //胜利者
    private static String winner;
    @Override
    public void run() {
       //假设赛道长100米兔子每过10s睡一次觉
       for(int i=0;i<=100;i++){
           if(i%10==0&&Thread.currentThread().getName().equals("rabbit")){
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
           System.out.println(Thread.currentThread().getName()+"-->"+i);
           boolean flag=gameOver(i);
           if(flag){
               System.out.println("winner is "+winner);
               break;

           }
       }
    }
    //判断是否到达终点
    private boolean gameOver(int i){
        if(winner!=null){
            return true;
        }else{
            if(i==100){
               winner=Thread.currentThread().getName();
               return true;
            }else {
                return false;
            }
        }
    }

    public static void main(String[] args) {
        Racter racter=new Racter();
        new Thread(racter,"rabbit").start();
        new Thread(racter,"tortoise").start();

    }
}

实现Callable(一般实际开发中使用的方式)



import java.util.concurrent.*;

public class NewClassable implements Callable<Boolean> {
    private  String path;
    public  NewClassable(String path){
        this.path=path;
    }
    @Override
    public Boolean call() throws Exception {
        System.out.println(path);
      down();
        return true;
    }
    private void down(){
        System.out.println("图片下载");
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        NewClassable n1=new NewClassable("a");
        NewClassable n2=new NewClassable("b");
        NewClassable n3=new NewClassable("c");
        //创建执行任务
        ExecutorService service= Executors.newFixedThreadPool(3);
        //提交服务
        Future<Boolean> rt1=service.submit(n1);
        Future<Boolean> rt2=service.submit(n2);
        Future<Boolean> rt3=service.submit(n3);
        //获取结果
        boolean r1=rt1.get();
        boolean r2=rt2.get();
        boolean r3=rt3.get();
        //关闭服务
        service.shutdownNow();
    }
}

此文章来至个人视频资料整理,请多指教.

作者:欲指_Object
来源:CSDN
原文:https://blog.csdn.net/apple596529/article/details/89449905
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章

  • iOS基础知识 (三)

    多线程 多线程创建方式 iOS创建多线程方式主要有NSThread、NSOperation、GCD,这三种方式创建...

  • Java多线程 ----(1)多线程基础

    1、什么是多线程和使用多线程的意义2、多线程基础知识点框架图3、实现多线程的三种方式4、三种方式对比 1、什么是多...

  • 线程池的使用入门

    在上一篇文章中,我们总结了三种创建线程的方式:《Java多线程基础——三种创建线程的方式》,然而在真实的开发中很少...

  • JAVA基础—创建线程的3种方式

    线程的生命周期(五种状态) 创建线程的三种方式对比 1. 创建多线程-继承Thread 运行结果 2. 创建多线程...

  • Java多线程基础一

    多线程创建的三种方式 lambda

  • 多线程

    多线程的三种方式 ※NSThread:共有三种创建方式,任选其一 方式1.实例方法来创建一个子线程,需要手动来开启...

  • C++11多线程-【1】创建线程的三种方式

    C++11多线程-【1】创建线程的三种方式 本文翻译自 C++11 Multithreading – Part 1...

  • 线程的三种实现方法。

    多线程创建的三种方式: 1,创建线程第一种方式(继承Thread): * 1,自定义一个类,继承java.lan...

  • Java多线程

    1.创建多线程的三种方式 1. 继承Thread类 2. 实现Runnable接口 ...

  • 【java基础】线程

    java基础 线程 参考详细:Java之多线程 一、创建线程 创建线程常见有两种方式,另外有两种新增方式 1.Th...

网友评论

      本文标题:多线程基础1:创建线程的三种方式

      本文链接:https://www.haomeiwen.com/subject/hmjygqtx.html