zoukankan      html  css  js  c++  java
  • 整理一下创建线程的几种方法以及代码示例

    最近在看《JAVA并发编程实战》这本书,以前对创建一个线程来执行任务都是比较混乱的,思路不清晰,而且写代码的时候也无从下手。

    在阅读这本书的过程中,逐渐对线程这个概念愈发清晰,于是今天整理一下如何创建线程来完成任务。

    在网上众多博客以及面试题中,都会提到使用线程的4种方式

    1. 通过继承Thread

    2. 通过实现Runnable

    3. 通过Callable+FutureTask

    4. 通过线程池

    这样的说法虽说有些不严谨,但是以现在我的知识储备还不能完全的指出到底哪里不严谨,跑偏了。

    首先是第1种,通过继承Thread来创建线程

    Thread类就是线程在java中的形象。创建一个Thread并启动就相当于开启了一个线程,而线程做的任务就是Thread类里的run()方法,因此我们需要重写这个run()方法用于完成我们想要做的任务

    所以该方法是让一个类A继承Thread,并且重写它的run()方法。

    创建一个线程并启动的写法通常是new Thread().start();

    因为类A继承了Thread,所以写法变成了new A().start();

    示例如下

    public class ThreadExample {
        @Test
        public void example1(){
            System.out.println("这是主线程"+Thread.currentThread().getName());
            //创建一个线程并且启动
            new A("A").start();
        }
    
        /**
         * 通过继承Thread并且重写run()方法来使用线程完成任务
         */
        public class A extends Thread{
            public A(String name) {
                super(name);
            }
    
            @Override
            public void run() {
                System.out.println("这是一个新的线程"+Thread.currentThread().getName());
            }
        }
    }

    接着是第2种方法,通过实现Runnable接口来使用线程

    Thread类有一个构造器,其形参为Runnable类,既然是作为一个参数传入,那其实就存在两种方式

    ①就是通过类B实现Runnable接口并重写run()方法,然后将类B的实例作为参数传入

    ②创建一个Runnable的匿名内部类传入(这种方法有个好处就是,线程中执行任务的类可以不用implements Runnable接口,直接在匿名内部类的重写run方法中调用执行任务类的方法即可完成任务)

    以下是两种实现方式的代码

    public class ThreadExample {
        @Test
        public void example2(){
            System.out.println("这是主线程,"+Thread.currentThread().getName());
            //创建一个线程并传入B的实例对象
            new Thread(new B(),"B").start();
    
        }
    
        /**
         * 方式①:通过实现Runnable接口的方式实现
         */
        private class B implements Runnable{
    
            @Override
            public void run() {
                System.out.println("这是一个新线程"+Thread.currentThread().getName());
            }
        }
    }
    public class ThreadExample {
        @Test
        public void example3(){
            System.out.println("这是主线程,"+Thread.currentThread().getName());
            /**
             * 方式②:通过传入一个Runnable匿名内部类来实现
             */
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("这是一个新线程"+Thread.currentThread().getName());
                }
            },"B").start();
        }
    }

    第3种方法和第4种方法后期再补充

  • 相关阅读:
    C#解析PDF
    Ora-03113Ora-03114与Oracle In 拼接字符串的问题
    [Linux] nohup/setsid/& 让进程在后台可靠运行
    [Python] json 报错'xxx is not JSON serializable'的处理方法
    [Linux] 虚拟环境的配置和使用 virtualenv
    [Python] 跳过前几行快速读取文件内容:islice
    对pandas的dataframe绘图并保存
    matplotlib 数据可视化
    awk结合正则匹配
    Pandas库常用函数和操作
  • 原文地址:https://www.cnblogs.com/skyvalley/p/15362485.html
Copyright © 2011-2022 走看看