返回顶部
首页 > 资讯 > 后端开发 > Python >java实现/创建线程的几种方式小结
  • 844
分享到

java实现/创建线程的几种方式小结

2024-04-02 19:04:59 844人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

进程与线程 进程可以简单理解成一个可执行程序例如.exe,在windows中的任务管理器中可以查看每一个进程,进程是一次程序的执行,是程序在数据集合上运行的过程,是系统资源调度的一

进程与线程

进程可以简单理解成一个可执行程序例如.exe,在windows中的任务管理器中可以查看每一个进程,进程是一次程序的执行,是程序在数据集合上运行的过程,是系统资源调度的一个单位。进程主要负责向操作系统申请资源。然而一个进程中,多个线程可以共享进程中相同的内存或文件资源。线程就是一个进程一个程序要完成所依赖的子任务,这些子任务便可以看作是一个线程。

第一种方式继承Thread类

从java源码可以看出Thread类本质上实现了Runnable接口的实例类,代表了线程的一个线程的实例,启动的线程唯一办法就是通过Thread类调用start()方法,start()方法是需要本地操作系统的支持,它将启动一个新的线程,并且执行run()方法。

继承Thread类实现线程代码如下

创建一个Thread类,对象直接调用run方法会出现什么问题?


package cn.thread.线程;

public class MyThread extends Thread{
    public MyThread(String name){
        super(null,null,name);
    }
    int piao =10;
    @Override
    public void run() {
        while(piao>0){
            System.out.println(Thread.currentThread().getName()+"......"+piao--);
        }
    }

    public static void main(String[] args) {
        MyThread mt = new MyThread("x");
        mt.run();
    }
}

结果:

可以发现是主线程执行了run方法,并不是用户线程执行的run方法,此时可以得出用户线程并没有启动,所以并不会执行run里面的方法,且执行完run方法便结束线程。

第二种创建线程的方法,实现Runnable接口

相比继承Thread类而言,实现接口的可扩展性得到了提升,Runnable接口也必须要封装到Thread类里面,才可以调用start方法,启动线程。

实现代码


package cn.thread.线程;

public class MyRunnable implements Runnable{

    int piao = 10;
    @Override
    public void run() {
        while(piao>0){
            System.out.println(Thread.currentThread().getName()+"-----"+piao--);
        }
    }

    public static void main(String[] args) {
        Runnable r =new MyRunnable();
        Thread t =new Thread(r);
        t.start();
    }

}

结果

第三种创建线程的方法实现Callable接口

Callable接口使用方法和Runnable接口的方法类似不同的一点是Callable接口具有返回值,返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。

实现代码

对下列代码进行分析

首先callable是接口不能直接创建对象,也不能创建线程。并且要实现call方法类似run方法的功能,call方法有返回值,会计算结果,如果无法计算结果,则抛出一个异常。

执行callable任务之后,可以获得一个future的对象,future基本上是主线程可以跟踪进度以及获取其他线程结果的一种方式。在这里Test1()方法主要利用线程池和future的方法,去启动实现Callable接口的线程,具有返回值。而Test2()主要是采用FutureTask类去实现创建一个实现callable接口的线程,futuretask实现了future接口。


package com.openlab.test;

import java.util.Random;
import java.util.concurrent.Callable;

public class CallableTest implements Callable{

	@Override
	public Object call() throws Exception {
		
		Random generator = new Random();
		
		Integer randomNumber = generator.nextInt(5);
		
		Thread.sleep(randomNumber*1000);
		
		return randomNumber;
	}

}

综合练习代码:


package cn.thread.线程;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;

public class CallableTest implements Callable<Object> {//不能直接创建线程
    int taskNum;
    public CallableTest(int taskNum){
        this.taskNum = taskNum;

    }
    @Override
    public Object call() throws Exception {

        System.out.println(">>>"+taskNum+"任务启动");
        Date dataTemp = new Date();
        Thread.sleep(1000);
        Date dataTemp2 = new Date();
        long time  = dataTemp2.getTime() - dataTemp.getTime();
        System.out.println(">>>>"+taskNum+"任务终止");
        return taskNum+"任务返回运行结果"+time;
//        Random generator = new Random();
//        Integer randomNumber = generator.nextInt(5);
//        Thread.sleep(randomNumber*1000);
//        return  randomNumber;
    }
    
     static void test1() throws ExecutionException, InterruptedException {
         System.out.println("程序开始");
         Date data1 = new Date();
         int taskSize = 5;
        //构建线程池对象
         ExecutorService pool = Executors.newFixedThreadPool(taskSize);
         List<Future> list =new ArrayList<Future>();
         for(int i=0;i<taskSize;i++){

             Callable c = new CallableTest(i);
             Future f = pool.submit(c);
             list.add(pool.submit(c));

         }
         //关闭线程池
         pool.shutdown();
         for(Future f:list){
             System.out.println(">>>"+f.get().toString());
         }
         Date date2 = new Date();
         System.out.println("程序运行结束-----"+(date2.getTime()-data1.getTime())+"毫秒");
     }
     
     static  void test2() throws ExecutionException, InterruptedException {
         System.out.println("----程序开始-----");
         Date date1 =new Date();
         int taskSize = 5;
         FutureTask[] randNumber = new FutureTask[taskSize];
         List<Future> list =new ArrayList<Future>();
         for(int i=0;i<taskSize;i++){
             Callable c = new CallableTest(i);
             randNumber[i] = new FutureTask(c);
             Thread t = new Thread(randNumber[i]);
             t.start();

         }
         for(Future f:randNumber){
             System.out.println(">>>"+f.get().toString());
         }
         Date date2 = new Date();
         System.out.println("程序运行结束-----"+(date2.getTime()-date1.getTime())+"毫秒");

     }
    public static void main(String[] args) throws Exception {
//        CallableTest c = new CallableTest();
//        Integer i = (Integer) c.call();
        test1();
        test2();

    }
}

执行结果

第四种实现线程的方法,基于线程池

其实在第三种的方法中就提到了两种实现方法,一种线程池+future,另一种futuretask的方法。线程和数据库连接这些资源都是非常宝贵的资源。那么每次需要的时候创建,不需要的时候销毁,是非常浪费资源的。那么我们就可以使用缓存的策略,也就是使用线程池。


// 创建线程池
 ExecutorService threadPool = Executors.newFixedThreadPool(10);
 while(true) {
 threadPool.execute(new Runnable() { // 提交多个线程任务,并执行
 @Override
 public void run() {
 System.out.println(Thread.currentThread().getName() + " is running ..");
 try {
 Thread.sleep(3000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 });
 } }

总结

理论上实现线程的方法还有一些,本文所提及到的,基本都是一些创建线程常用的方法。希望本文对大家在学习线程的过程中有所帮助。

--结束END--

本文标题: java实现/创建线程的几种方式小结

本文链接: https://lsjlt.com/news/132089.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java实现/创建线程的几种方式小结
    进程与线程 进程可以简单理解成一个可执行程序例如.exe,在Windows中的任务管理器中可以查看每一个进程,进程是一次程序的执行,是程序在数据集合上运行的过程,是系统资源调度的一...
    99+
    2024-04-02
  • Java 中创建线程的几种方式
    Java 是一种面向对象的编程语言,它支持多线程编程。多线程编程是指在一个程序中同时运行多个线程,这些线程可以并行执行,以提高程序的效率和性能。Java 提供了多种创建线程的方法,本文将介绍这些方法以...
    99+
    2023-09-13
    java jvm servlet
  • java中创建线程有几种方式
    线程的创建方式继承Thread类实现多线程覆写Runnable()接口实现多线程,而后同样覆写run()。推荐此方式使用Callable和Future创建线程相关视频教程推荐:java学习视频实例如下:继承Thread类实现多线程 publ...
    99+
    2018-07-06
    java教程 java 线程 创建 方式
  • Java线程创建的四种方式总结
    多线程的创建,方式一:继承于Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run()--->将此线程执行的操作声明在run()中 3.创建Th...
    99+
    2024-04-02
  • springboot创建线程池的两种方式小结
    目录springboot创建线程池两种方式1.使用static代码块创建2.使用@Configuration @bean注解,程序启动时创建springboot如何开启线程池定义线程...
    99+
    2024-04-02
  • Java 实现并发的几种方式小结
    Java实现并发的几种方法 Java程序默认以单线程方式运行。 synchronized Java 用过synchronized 关键字来保证一次只有一个线程在执行代码块。 pu...
    99+
    2024-04-02
  • Java 异步实现的几种方式小结
    Java 异步实现的几种方式 1. jdk1.8之前的Future jdk并发包里的Future代表了未来的某个结果,当我们向线程池中提交任务的时候会返回该对象,可以通过future...
    99+
    2024-04-02
  • Java线程的三种创建方式
    目录1、Thread2、Runnable和Thread3、Runnable和Thread4、三者对比5、注意项1、Thread 继承Thread类,并重写run方法 class ...
    99+
    2024-04-02
  • java中实现多线程的几种方式
    Java多线程的使用有三种方法:继承Thread类、实现Runnable接口和使用Callable和Future创建线程。一、继承Thread类实现方式很简单,只需要创建一个类去继承Thread类然后重写run方法,在main方法中调用该类...
    99+
    2016-12-01
    java 多线程 方式
  • java 多线程的几种实现方法总结
    java 多线程的几种实现方法总结1.多线程有几种实现方法?同步有几种实现方法?多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与noti...
    99+
    2023-05-30
    java 多线程 ava
  • java创建多线程的七种方式
    一、继承Thread,重写run方法 通过自定义一个类(这里起名为:MyThread),继承Thread类,重写run方法,最后在main方法中new出MyThread实例,调用这个实例的继承的Thread类的start方法创建一个线程。 ...
    99+
    2023-09-26
    java
  • java多线程的实现方式有哪几种
    在Java中,有以下几种实现多线程的方式:1. 继承Thread类:创建一个继承自Thread类的子类,并实现run()方法。通过调...
    99+
    2023-09-26
    java
  • Java线程协作的两种方式小结
    目录为什么线程之间需要协作介绍方法一方法二为什么线程之间需要协作 线程之间相互配合,完成某项工作,比如:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个...
    99+
    2023-05-19
    Java线程协作
  • java 实现开启异步线程的几种方式
    在Java中,有多种方式可以实现异步线程以避免在主线程中执行耗时操作导致界面卡顿的问题。以下是几种常用的方式: 使用Thread类:可以使用Thread类来创建一个新的线程,并在其run()方法中执行耗时操作。例如: new Thread(...
    99+
    2023-08-17
    java
  • Java 终止线程的几种方式
    一、正常运行结束 所谓正常运行结束,就是程序正常运行结束,线程自动结束。 public class ThreadTest extends Thread { public void run() ...
    99+
    2023-08-31
    java jvm 开发语言
  • 3种Java创建线程的方式和区别
    在java中如何创建线程?下面本篇文章给大家介绍3种创建线程的方式以及区别。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。在java中如果要创建线程的话,一般有3种方法:继承Thread类;实现Runnable接口;使用C...
    99+
    2017-09-19
    java入门 Java 线程
  • Java创建多线程的8种方式集合
    目录1、继承Thread类,重写run()方法2、实现Runnable接口,重写run()3、匿名内部类的方式4、带返回值的线程(实现implements Callable<返...
    99+
    2024-04-02
  • Java实现线程同步的四种方式总结
    目录什么是线程同步线程同步的几种方式1.使用synchronized关键字2.使用ReentrantLock3.使用原子变量实现线程同步4.ThreadLocal实现线程同步什么是线...
    99+
    2024-04-02
  • Java多线程的常用创建方式总结
    Java多线程的创建方式 Java现在有四种创建的方式:继承Threa类、实现Runnable接口、实现Callable接口、线程池 Thread、Runnable都在java.la...
    99+
    2024-04-02
  • java创建对象的方式有哪几种
    在Java中,可以通过以下几种方式创建对象:1. 使用new关键字:通过使用new关键字,可以调用类的构造方法实例化一个对象。例如:...
    99+
    2023-10-10
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作