Java多线程的创建(二)

  • 前言:

    虽然java的API中说创建多线程的方式只有两种(There are two ways to create a new thread of execution),分别是继承Thread类创建和实现Runnable接口创建,在上一篇博文中演示了这两种,详见,但是JDK5.0以后新增了两种,分别是实现Callable接口创建和使用线程池创建,本次就演示后两种创建方式并分析其特性。


  • 实现Runnable接口创建多线程

    创建步骤:

    1.创建一个实现Callable接口的类。

    2.重写call()方法,线程需要执行的代码都放到call方法中。

    3.创建实现Callable接口类的实例对象。

    4.将步骤 3 的对象作为参数传给FutureTask构造器中,创建FutureTask对象。

    5.将FutureTask的对象作为参数传给Thread类,创建对象并调用start()方法。

package day02;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

//创建一个多线程,输出20以内的偶数,并返回所有偶数的和
//1.创建一个实现`Callable`接口的类。
class TestSum implements Callable{
   //2.重写call()方法,线程需要执行的代码都放到call方法中。
    @Override
    public Object call() throws Exception{
        int sum = 0;
        for(int i = 1;i <= 20 ;i++ ){
            if(i % 2 == 0){
                System.out.println(i);
                sum = sum + i;
            }
        }
        return sum;
    }
}

public class ThreadCall {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //3.创建实现`Callable`接口类的实例对象。
        TestSum test = new TestSum();
        //4.将步骤 3 的对象作为参数传给`FutureTask`构造器中,创建`FutureTask`对象。
        FutureTask futuretask = new FutureTask(test);
        //5.将`FutureTask`的对象作为参数传给`Thread`类,创建对象并调用start()方法。
        Thread thread = new Thread(futuretask);
        thread.start();
        //get方法可以获取返回值
        System.out.println("偶数总合是:"+futuretask.get());
    }
}
//输出结果:
2
4
6
8
10
12
14
16
18
20
偶数总合是:110

实现Callable接口创建多线程的特点:

? 1.call()方法可以有返回值,可以使用get()方法获取返回值。

? 2.call()方法可以抛出异常, 而且能被外面捕获到。

? 3.Callable支持泛型。


  • 使用线程池创建多线程

    一.实现Runnable接口的方式创建:

package day02;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Number implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            if (i % 2 == 0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}

public class ThreadPool {
    public static void main(String[] args){
        ExecutorService service = Executors.newFixedThreadPool(10);
        Number num = new Number();
        service.execute(num);
        service.shutdown();

二.实现Callable接口的方式创建:

package day02;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Number implements Callable {
    @Override
    public Object call() {
        for (int i = 0; i < 20; i++) {
            if (i % 2 == 0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
        return null;
    }
}

public class ThreadPool {
    public static void main(String[] args){
        ExecutorService service = Executors.newFixedThreadPool(10);
        Number num = new Number();
        service.submit(num);//区别在这里
        service.shutdown();
    }
}
  • 线程池好处:

    1.频繁创建线程和销毁使用量较大的资源,比如并发的线程,对性能影响较大,所以需要创建线 程池存放线程,使用的时候直接获取,实现重复利用,提高效率。

    2.降低创建线程时间,提高响应速度。

    3.降低资源的消耗。

    4.便于线程管理。

原文地址:https://www.cnblogs.com/coding-996/p/12149965.html

时间: 2024-11-03 20:46:12

Java多线程的创建(二)的相关文章

Java多线程(1) 创建

一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下以下这张较为经典的图: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();).线程即进入就绪状态.处于就绪状态的线程,仅仅是说明此线程已经做好了准备.随时等待CPU调度运行.并非说运行了t.start()此线程马上就会运行: 执行状态(Runn

Java多线程基础(二)定时器类:Timer类和TimerTask类

Java多线程基础(二)定时器类:Timer类和TimerTask类 Timer类和TimerTask类是jdk实现定时器功能的早期方法,jdk1.5以前就支持Timer类和TimerTask类.JDK1.5之后引入了新的机制,将在后续博文中研究. 1 指定时间间隔后执行任务 import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TraditionalTimerTest {

java多线程笔记(二)

      java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Semaphore.   线程同步问题引入:       创建一个银行账户Account类,在创建并启动100个线程往同一个Account类实例里面添加一块钱.在没有使用上面三种方法的情况下: 代码: import java.util.concurrent.ExecutorService; import

Java多线程详解(二)

评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡之后,后台线程没有了服务对象,不久就会自动死亡,不再复活.利用setDaemon方法可以把一个线程设置为后台线程,但必须在线程启动之前调用. 例如 : /* * @author [email protected] */ public class DaemonThread extends Thread { pu

Java多线程编程(二)

在 Java多线程编程(一) 中的多线程并没有返回值,本文将介绍带返回值的多线程. 要想有返回值,则需要实现新的接口Callable而不再是Runnable接口,实现的方法也改为call()方法,执行器也不再是调用execute(),而是submit() [程序实例] 1 public class TaskWithResult implements Callable<String> { 2 3 private int id; 4 5 public TaskWithResult(int id)

java多线程学习(二)——线程的创建

一.java创建线程的两个方法 1.从java.lang.Thread类派生出一个新的线程类,重载它的run()方法 2.实现Runnable接口,重载Runnable接口中的run()方法. 使用Thread类来创建线程和创建普通类的对象的操作是一样的,线程是Thread类或者其子类的实例对象. 二.java提供的两种创建线程的区别 java中类是单继承的,当定义一个新的线程类的时候,它只能扩展一个外部类,那么当创建的线程是继承自Thread类来实现的,那么此线程类无法再扩展其他类,无法实现复

Java多线程学习(二)

一.定义产生返回值的任务 在上一篇文的介绍中,我们知道了定义任务通常的方法是定义一个实现Runnable接口的类,这个类被我们成为任务.然而也很容易注意到,任务的最重要的一个方法就是run( )方法,而run( )方法是没有返回值的,也就是说我们之前定义的任务不返回任何值. 如果想要定义一个有返回值的任务,则需要编写一个实现Callable接口的类.Callable是一种具有类型参数的泛型,他的类型参数表示的是call( )方法的返回值类型. 示例如下: 1 import java.util.c

java多线程总结(二)

线程一般有6个状态: 新建状态:NEW 可运行状态:RUNNABLE 休眠状态:TIMED_WAITING 等待状态:WAITING 阻塞状态:BLOCKED 终止状态"TERMINATED 当我们使用new创建线程之后,线程处于新建状态,当调用start方法之后,线程出于可运行状态,当线程需要获得对象的内置锁,而这个锁被其他线程所占用的时候,线程就出于阻塞状态,当线程等待其他线程通知调度表可以运行时,线程处于等待状态,当一个含有时间参数的方法,必须sleep()方法,可以让线程处于计时等待状态

java多线程的创建方式

根据Thread类中的run方法 public void run() { if (this.target == null) return; this.target.run(); } 可以知道运行多线程代码有两种方式,一种是运行Thread类run方法中的代码,一种是运行target中的run代码. 方法一:运行Thread类run方法中的代码 Thread thread1=new Thread(){ @Override public void run() { while(true){ try {