• Java线程代码实现


    线程的Java实现

    参考博客:(http://www.importnew.com/20672.html)

    1.继承Thread

    声明Thread的子类; 这种方法是创建类继承Thread,然后重写Thread中的run方法

    public class MyThread extends Thread {
       public void run(){
         System.out.println("MyThread running");
       }
    }
    

    稍微看一下Thread类的源码,原本的run方法:

    /* What will be run. */
    private Runnable target;
    
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
    

    其中的target是run的任务,而新类直接继承Thread,重写run方法,相当于直接描述了run方法中要运行的任务。

    运行Thread子类的方法

    MyThread myThread = new MyThread();
    myTread.start();
    

    2.创建Thread的匿名子类

    Thread thread = new Thread(){
       public void run(){
         System.out.println("Thread Running");
       }
    };
    thread.start();
    

    3.实现Runnable接口

    其实通过上面的Thread源码可以发现,实现Runnable target的构建,那么Thread的run方法也就有了实际意义;因此另一个多线程的写法是新类实现Runnable接口

    public class RunnableThread implements Runnable {
    	@Override
    	public void run() {
    		System.out.println(Thread.currentThread().getName());
    	}
    
    }
    

    运行

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new Thread(new RunnableThread()).start();
        }
    }
    

    4.创建实现Runnable接口的匿名类

    new Thread(new Runnable(){
        @override
        public void run() {
            System.out.println("Thread is running");
        }
    }).start();
    

    5. 使用FutureTask

    FutureTask实现了Runnable接口,因此FutureTask的对象也是可以当做runner的;而FutureTask对象的构造需要填入一个实现Callable接口的对象,因此:

    public class CallableThread implements Callable<Integer> {
    	@Override
    	public Integer call() throws Exception {
    		int i = 2017;
    		Thread.sleep(3000);
            System.out.println(Thread.currentThread().getName() + " " + i);
            return i;
    	}
    }
    

    运行测试一下:

    for (int i = 0; i < 5; i++) {
        FutureTask<Integer> futureTask = new FutureTask<Integer>(new CallableThread());
        new Thread(futureTask, "有返回值的线程").start();
        try {
            System.out.println(futureTask.get());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    

    但是这里有一个疑惑,就是输出是一个一个出来的,也就是看上去这五个线程是同步的,以后再研究一下,这块比较鬼

  • 相关阅读:
    安装mongodb,开启mongo服务,创建mongodb用户,登陆mongodb
    【Flask】bootstrap table基础
    【网络安全】加解密算法最详解
    UAC table
    Docker的部署安装(CentOS)-by paymob
    Docker中运行MySQL5.7并挂载宿主机目录到镜像
    搭建harbor企业级私有registry
    Rancher的部署安装(编排选用K8S)
    使用Rancher pipeline搭建基于容器的CICD
    Docker的部署安装(CentOS)
  • 原文地址:https://www.cnblogs.com/yanwenxiong/p/7376313.html
Copyright © 2020-2023  润新知