zoukankan      html  css  js  c++  java
  • Java 多线程基础(二)多线程的实现方式

    Java 多线程基础(二)多线程的实现方式

    在Java中,java使用Thread类代表线程,所有的线程对象都必须是Thread或者其子类的实例,每个线程的作用是完成一定任务,实际上是就是执行一段程序流(一段顺序执行的代码)。实现多线程一共有4种方式,分别是继承于Thread 类、实现 Runnable 接口、带有返回结果的 Callable 接口通过FutureTask包装器来创建T和使用 ExecutorService、Callable、Future 实现有返回结果的线程。

    其中,继承 Thread 和 实现 Runnable 接口是实现多线程最常用的两种方式,两者实现的线程是没有返回结果的。

    带有返回结果的 Callable 接口通过FutureTask包装器来创建T和使用 ExecutorService、Callable、Future 实现有返回结果的线程。是JDK1.5之后更新的,可以创建带有返回值的线程,两者在java.util.concurrent包中通过的线程池来实现多线程。

    一、Runnable 接口

    Runnable 是一个接口,该接口只定义了一个 run() 方法,由实现类实现。该接口的定义如下:

    @FunctionalInterface  // 此注解表明这是函数式接口
    public interface Runnable {
        public abstract void run();
    }

    Runnable的作用是实现多线程。我们可以定义一个类实现 Runnable 接口;然后,通过new Thread(new A())等方式新建线程。

    二、Thread 类

     Thread 类本身实现了 Runnable 接口,在Runnable 接口的基础上,扩展了多线程的功能,该类的定义如下:

    public class Thread implements Runnable { }

    Thread 的作用也是实现多线程。我们可以定义一个类继承 Thread 接口,然后重写 run() 方法;然后通过通过new 自定义类()等方式新建线程。

    三、Thread 和 Runnable的异同

    1、相同点:都是“多线程的实现方式”。

    2、不同点:Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。通常,建议通过“Runnable”实现多线程!

    四、实例

    通过网上经典卖票的的例子,演示 Thread 和 Runnable 的实例。

    1、继承 Thread 类

    // 继承Thread 的线程类
    class MyThread extends Thread{
        private int ticket = 10;
        @Override
        public void run() {
            while(true) {
                if(this.ticket < 1) break;
                System.out.println(Thread.currentThread().getName() + "--> 正在卖 " + this.ticket + "张票");
                this.ticket--;
            }
        }
    }
    // main 方法类
    public class ThreadDemo {
        public static void main(String[] args) {
            Thread t1 = new MyThread();
            Thread t2 = new MyThread();
            Thread t3 = new MyThread();
            
            // 开启3个线程,每个线程各卖 10 张票
            t1.start();
            t2.start();
            t3.start();
        }
    }

    2、实现 Runnable 接口

    //实现 Runnable接口的自定义线程类
    class MyRunnable implements Runnable{
        private int ticket = 10;
        @Override
        public void run() {
            while(true) {
                if(this.ticket < 1) break;
                System.out.println(Thread.currentThread().getName() + "--> 正在卖 " + this.ticket + "张票");
                this.ticket--;
            }
        }
    }
    public class ThreadDemo {
        public static void main(String[] args) {
            Runnable run = new MyRunnable();// 实现 Runnable接口的自定义线程类
            // 创建三个 Thread 对象,传递同一个MyRunnable 对象
            Thread t1 = new Thread(run);
            Thread t2 = new Thread(run);
            Thread t3 = new Thread(run);
            
            // 开启3个线程,3个线程共卖10张票
            t1.start();
            t2.start();
            t3.start();
        }
    }
  • 相关阅读:
    自定义实现wcf的用户名密码验证
    EF6:编写你自己的code first 数据迁移操作(睡前来一篇,翻译的)
    .net 连接Redis
    idea external libraries 只有jdk问题
    MAC vim安装gruvbox主题
    Mac gitk安装与优化
    spring security 4 filter 顺序及作用
    mysql 采样查询 / 间隔查询 / 跳跃查询的两种实现思路
    nginx warn an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/ while reading upstream
    nginx日志 logrotate配置
  • 原文地址:https://www.cnblogs.com/lingq/p/12944204.html
Copyright © 2011-2022 走看看