java多线程四种实现方法

package com.zrun.TestThread;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class App {
    public static void main(String[] args) throws Exception, ExecutionException {
        System.out.println("主线程启动:"
                + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                        .format(new Date()));

        // 方式1
        // ThreadEx thread1 = new ThreadEx();
        // thread1.start();
        // Thread.sleep(2000);
        // System.out.println("主线程执行结束:"
        // + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        // .format(new Date()));

        // 方式2
        // Thread thread2 = new Thread(new RunableEx());
        // thread2.start();
        // Thread.sleep(2000);
        // System.out.println("主线程执行结束:"
        // + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        // .format(new Date()));

        // 方式3
        // Callable<Object> oneCallable = new Thread3<Object>();
        // FutureTask<Object> oneTask = new FutureTask<Object>(oneCallable);
        // Thread t = new Thread(oneTask);
        // t.start();
        // Thread.sleep(2000);
        // System.out.println("主线程执行结束:"
        // + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        // .format(new Date()));
        // // 主线程执行的2秒钟之后,子线程只要再过3秒就结束了,从而得到子线程的结果;这里get方法会阻塞主线程
        // System.out.println(oneTask.get().toString());

        // 方式4
        Thread4.test();
        Thread.sleep(2000);
        System.out.println("主线程执行结束:"
                + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                        .format(new Date()));
    }
}

// 方式1:继承Thread类
class ThreadEx extends Thread {
    @Override
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("子线程执行结束:"
                + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                        .format(new Date()));
    }
}

// 方式2:实现Runnable接口
class RunableEx implements Runnable {
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("子线程执行结束:"
                + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                        .format(new Date()));
    }
}

// 方式3:通过Callable和FutureTask;这种方式可以拿到子线程的返回值
class Thread3<Object> implements Callable<Object> {

    @Override
    public Object call() throws Exception {
        Thread.sleep(5000);
        return (Object) ("我是子线程的返回值:" + new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
}

// 方式4:通过线程池创建线程
class Thread4 {
    static int POOL_NUM = 5;

    public static void test() {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < POOL_NUM; i++) {
            RunableEx thread = new RunableEx();
            executorService.execute(thread);
        }
        // 关闭线程池
        executorService.shutdown();
    }
}

原文地址:https://www.cnblogs.com/yinchh/p/10409904.html

时间: 2024-10-29 00:16:40

java多线程四种实现方法的相关文章

java多线程四种实现模板

假设一个项目拥有三块独立代码块,需要执行,什么时候用多线程? 这些代码块某些时候需要同时运行,彼此独立,那么需要用到多线程操作更快... 这里把模板放在这里,需要用的时候寻找合适的来选用. 总体分为两种: 一.使用匿名内部类的方式(推荐) 1)方式1开启多线程(Thread) //使用第一种方式,开启线程 new Thread() { public void run() { for(int i=0;i<100;i++) { System.out.println(Thread.currentThr

JAVA中运用数组的四种排序方法

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序.下面我就将他们的实现方法一一详解供大家参考. <1>利用Arrays带有的排序方法快

Java的四种引用类型

Java中有四种引用类型:强引用.软引用.弱引用.虚引用.--应该是从1.2版本开始添加的. 这个概念是与垃圾回收有关的. 如果你不知道这几个概念,那你用的肯定都是强引用.例如String str = new String(); 这个str到 new String() 的引用类型就是强引用. 那什么是弱引用呢?先看一段代码: 1 package cn.larry.pojo; 2 3 public final class Product { 4 private String name; 5 6 p

Java的四种引用源代码例子

Java的四种引用源代码例子 不解释,直接上代码,千言万语顶不住一行代码. package com.apkkids.javalanguage; import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference

java中四种引用类型

java中四种引用类型  今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在网上查资料,感觉收获颇多,现记录如下. 对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地

java多线程 —— 两种实际应用场景模拟

java多线程-两种实际应用场景模拟 转自 薛定谔的猫 (一) 先说说第一个,模拟对信息的发送和接收.场景是这样的: 就像笔者之前做的消息的发送,一个是服务器,一个是客户端.发送的话,要保证信息100%的发送给客户端,那么发给客户端之后,客户端返回一个消息告诉服务器,已经收到.当服务器一直没有收到客户端返回的消息,那么服务器会一直发送这个信息,直到客户端发送回确认信息,这时候再删除重复发送的这个信息. 为了模拟这个场景,这里写两个线程,一个是发送,一个是接收,把发送的信息,要保存到线程安全的对象

HashMap的四种遍历方法,及效率比较(简单明了)

https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<Integer, String>(); for (int i = 0; i < 40000; i++) { map.put(i, "第" + i + "个"); } //循环第一种 long t1 =

由ORACLE_SID想到脚本的四种运行方法

以前学习脚本知道一个概念,关于脚本运行方式的问题,我们熟知的脚本运行方式有以下几种: (1)../script.sh (点斜线脚本) (2).sh script.sh (sh空格脚本) (3).source script.sh (source空格脚本) (4).. script.sh (点空格脚本) 先写个简单的脚本,把执行结果贴在下面,然后分别对这几种脚本运行方式作解释. script.sh内容如下: ------------------------------- #!/bin/bash ec

C#四种深拷贝方法

//四种深拷贝方法 public static T DeepCopyByReflect<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || obj.GetType().IsValueType) return obj; object retval = Activator.CreateInstance(obj.GetType()); FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.