Java实现多线程的方法

Cadence Allegro 17.4学习记录开始01-原理图Capture CIS 17.4 Orcad的学习记录 阅读详情
 
n  在java的历史版本中,有两种创建多线程程序的方法
1.       通过创建Thread类的子类来实现
2.       通过实现Runable接口的类来实现(推荐)
一、通过Thread类实现多线程
设计Thread的子类
根据工作需要重新设计线程的run方法
n  线程类Thread中提供的run是一个空方法。为此,我们可以继承Thread,然后覆盖(override)其中的run,使得该线程能够完成特定的工作。
使用start方法启动线程,将执行权转交到run。
实例CODE:
import java.util.Random;
 
class MyThread extends Thread{
    private int sleepTime;
    private static Random generator=new Random();
    public MyThread(String n){
       super(n);
       } //n:线程名称
    public void run(){
        for(int i=0;i<5;i++){
            // 睡眠一段随机时间
            try{
             sleepTime=generator.nextInt(1000);
             Thread.sleep(sleepTime);
            }catch (InterruptedException e)
                     {e.printStackTrace();  }       
           //显示本线程名称
           System.out.print(getName()+"    ");
        } 
    }
}
 
public class MultiThreadExample{
    public static void main(String []args){
       new MyThread("A").start(); //启动线程A
       new MyThread("B").start(); //启动线程B 
    }
}
二、通过实现Runnable接口创建线程
n  创建线程最简单的方法就是创建一个实现Runnable 接口的类,这个类仅需实现其中一个run()方法。
n  主要步骤:
1.       创建某个类实现Runnable接口,实现run()方法。
2.       创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象。
3.       调用Thread的start方法。
示例CODE:
// Fig. 18.4: PrintTask.java
// PrintTask class sleeps for a random time from 0 to 5 seconds
import java.util.Random;
 
public class PrintTask implements Runnable
{
   private final int sleepTime; // random sleep time for thread
   private final String taskName; // name of task
   private final static Random generator = new Random();
   
   public PrintTask( String name )
   {
      taskName = name; // set task name
       
      // pick random sleep time between 0 and 5 seconds
      sleepTime = generator.nextInt( 5000 ); // milliseconds
   } // end PrintTask constructor
 
   // method run contains the code that a thread will execute
   public void run()
   {
      try // put thread to sleep for sleepTime amount of time
      {
         System.out.printf( "%s going to sleep for %d milliseconds.\n",
            taskName, sleepTime );
         Thread.sleep( sleepTime ); // put thread to sleep
      } // end try       
      catch ( InterruptedException exception )
      {
         System.out.printf( "%s %s\n", taskName,
            "terminated prematurely due to interruption" );
      } // end catch
       
      // print task name
      System.out.printf( "%s done sleeping\n", taskName );
   } // end method run
} // end class PrintTask
 
// Fig. 18.5: ThreadCreator.java
// Creating and starting three threads to execute Runnables.
import java.lang.Thread;
 
public class ThreadCreator
{
   public static void main( String[] args )
   {
      System.out.println( "Creating threads" );
 
      // create each thread with a new targeted runnable
      Thread thread1 = new Thread( new PrintTask( "task1" ) );
      Thread thread2 = new Thread( new PrintTask( "task2" ) );
      Thread thread3 = new Thread( new PrintTask( "task3" ) );
 
      System.out.println( "Threads created, starting tasks." );
 
      // start threads and place in runnable state
      thread1.start(); // invokes task1's run method
      thread2.start(); // invokes task2's run method
      thread3.start(); // invokes task3's run method
 
      System.out.println( "Tasks started, main ends.\n" );
   } // end main
} // end class RunnableTester  
 
 
n  Java有两种创建线程的方法,为什么推荐实现Runnable接口的方式创建线程?
n  Thread类定义了多种方法可以被派生类重载。对于所有的方法,唯一的必须被重载的是run()方法。这当然是实现Runnable接口所需的同样的方法。
n  很多Java程序员认为类仅在它们需要被加强或修改时被扩展。因此,如果你不重载Thread的其他方法,最好通过实现Runnable 接口,来创建线程。
二、使用Executor框架管理线程
n  虽然可以使用Thread类来显示的创建线程,但推荐的做法是使用Executor接口,让它来管理Runnable对象的执行。
n  通常Executor对象会创建并管理一组执行Runnable对象的线程,这组线程被称为线程池。
采用Executor的优势
n  Executor对象能够复用已有的线程,从而消除了为每个任务创建新线程的开销,
n  它能通过优化线程的数量,提高程序性能,保证处理器一直处于忙碌状,而不必创建过多的线程使程序资源耗尽。
 
步骤:
n  声明一个execute()方法,接收一个Runnable实参,
n  Executor会将传递给它的execute方法的每个Runnable对象赋予线程池中的某个可用线程。
n  如果没有可用线程,Executor会创建一个新线程,或者等待某个线程成为可用的,再将其赋予Runnable对象。
 
ExecutorService接口
n  该接口扩展了Executor接口,并声明了许多方法用于管理Executor的声明周期。
n  通过Executor类中的静态方法,可用创建实现ExecutorService接口的对象。
n  程序示例: ExecutorServiceTest
线程的同步
n  同一进程的多个线程共享同一存储空间,带来了访问冲突这个严重的问题。
n  有时两个或多个线程可能会试图同时访问一个资源,在此情况下,数据可能会变得不一致。
n  例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据,
n  某个时刻只允许一个线程排他性的访问操作共享对象的代码,当独占对象的线程在操作对象时,其他线程会一直等待,直到独占对象的那个线程完成了对对象的操作,其他对象才被允许处理该对象,
n  这种方法可以实现多个线程的协同工作,解决冲突问题。
实现线程同步
n  一种常见办法是使用java内置的监控器。
n  每个对象都具有一个监控器和一个监控锁,
n  监控器保证在任何时刻,它的对象的监控锁是由唯一一个线程持有的。
n  这样监控器和监控锁才能用于实现“互斥”。
n  Java中可用使用关键字synchronized为共享资源加锁。
n  synchronized可修饰一个代码块或一个方法,使被修饰对象在任一时刻只能有一个线程访问,从而提供了程序的同步执行功能。
 
n  两种方式实现同步:
n  使用同步方法:通过在方法声明中加入synchronized关键字来声明synchronized方法
n  public synchronized void methodA() {  }
n  当一个线程调用一个“互斥”方法时,它试图获得该方法锁。如果方法未锁定,则获得使用权,以独占方式运行方法体,运行完释放该方法的锁。如果方法被锁定,则该线程必须等待,直到方法锁被释放时。
 
n  注意:
n  对方法run( )无法加锁,不可避免冲突;
n  对构造函数不能加锁,否则出现语法错误。
n  synchronized方法虽然可以解决同步的问题,但也存在缺陷,
n  如果一个synchronized方法需要执行很长时间,将会大大影响系统的效率。
n  Java语言提供了一种解决办法,就是synchronized块。
 
1.       使用同步块
2.       可以通过synchronized关键字将一个程序块声明为synchronized块。
              synchronized(object) {  //要互斥的语句  }
n  当一个线程执行这段代码时,它获得特定对象的所有权,即拥有该对象的锁。此时,如果有第二个线程对同一个对象也要执行这段代码时,它也试图获得该对象的所有权,但因该对象已被锁定,则第二个线程必须等待,直到锁被释放为止。
n  第一个线程执行完代码段后,自动释放锁,接下去第二个线程获得锁并可运行。
 
n  注意:
n  当维护所需要的同步特性时,要尽可能的缩小同步语句占用的时间,这样就能最小化被阻塞线程的等待时间。
n  线程之间的同步是针对线程间共享可变数据的情况,对于线程间共享不可变数据时,应将数据字段声明成final的。
 
 
分享:  分享到微米  分享到新浪Qing   
Oracle EBS GL日记账批“选定以过账”状态数据修复 日记账来源:应收账款。用户操作过账以后,自动提交请求“过账:单一分类账”一直运行中,该请求执行5,6个小时甚至10多个小时无法完成,导致“标准管理器”阻塞大量请求待定,“冲突解决管理器”的待定数量不断增加。系统管理员不得不把该请求强制取消,此时,日记账批的状态处于“选定以过账”(GL_JE_BATCHES.STATUS为S),如下图 检查此日记账批有3千多条日记账题头,由于日记账比较多,日记账的科目余额计算需要大量服务器资源和执行时间比较长。 阅读详情

相关推荐

我用WorkBuddy“克隆“了一个我,从此每句话像我自己说的

各位,做这件事花了多长时间?准备样本可能要半小时,提炼风格十分钟,保存固化再花十分钟。加起来不到一个小时。但这一个小时之后呢?你就拥有了一个"永远在线的文字替身"。以后写口播稿,打开WorkBuddy跟它说;写课程逐字稿,跟它说;写公众号文章,也跟它说。写出来的东西,你的学员一看——“嘿,这不就是翟猛老师说的嘛。说到这儿,可能有人会问:老师,我的风格有那么重要吗?AI写的不都挺好的吗?各位你想想看,你为什么愿意听某个老师的课?不只是因为他讲的内容好,更是因为你喜欢他讲话的方式。

weixin_39284145的博客 820

013jmu-Java-07多线程-PrintTask

编写PrintTask类实现Runnable接口。 功能:输出从0到n-1的整数(n在创建PrintTask对象的时候指定)。并在最后使用System.out.println(Thread.currentThread().getName());输出标识信息。 裁判测试程序: import java.util.Scanner; /这里放置你的答案,即PrintTask类的代码/ public class Main { public static void main(String[] args) { Scann

ihopeyousuccess的博客 5929

(一)DaVinci Developer AutoSAR工具 如何新建SWC、Component、RTE工程,超级详细步骤,赚到

​ 1,创建SWC,第一步需要创建一个App组件类型,首先点击Object Brower菜单,然后左键Application Component Types 选项,然后右键New Application Component Type,组件类型的作用是来后续实例一个Compoent 2、 Properties 选项卡中Nane中输入Type的名字,注意根据规范命名规则已CtAp开头,其他默认就好 ​

weixin_42602687的博客 3577

6-6 jmu-Java-07多线程-PrintTask

编写类实现Runnable接口。输出从0到n-1的整数(n在创建PrintTask对象的时候指定)。并在最后使用输出标识信息。

weixin_65908362的博客 305

Sharding Sphere JDBC使用Mybatis的saveBatch无法返回主键的问题

Sharding Sphere JDBC使用Mybatis的saveBatch无法返回主键的问题

HHCS231的博客 1829

SAP 人力资源工资配置项3---工资项配置

工资项设置

xiouluoyang的专栏 1万+

Java线程详解

转载地址 Java线程:概念与原理 一、 进程与线程 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,即进程空间或(虚空间)。进程不依赖于线程而独立存在,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,线程没有自己...

weixin_41729259的博客 326

RK3568平台开发系列讲解:UBOOT详细介绍

U-boot是一款广泛使用的开源引导加载程序,支持多种嵌入式操作系统和处理器架构。其主要功能包括系统上电时的硬件初始化、引导操作系统内核等。U-boot的引导流程通常包括Boot Code、idbloader.img、uboot.img、boot.img和rootfs.img等步骤。启动U-boot时,通过Debug串口连接板卡,按下ctrl+c键可进入U-Boot命令行模式。U-boot启动过程中会执行一系列初始化操作,如打印系统信息、初始化内存、加载内核设备树、初始化I2C、PMIC电源芯片、DRM框架

内核笔记 808

Java程序设计 多线程编程题

6-1 jmu-Java-07多线程-Thread (5分) 编写MyThread类继承自Thread。创建MyThread类对象时可指定循环次数n。 功能:输出从0到n-1的整数。 并在最后使用System.out.println(Thread.currentThread().getName()+" "+isAlive())打印标识信息 裁判测试程序: import java.util.Scanner; /*这里放置你的答案,即MyThread类的代码*/ public class Main {

努力学习的小菜同学 3151

【Codecs系列】HEVC-SCC(一):核心技术介绍

DATE: 2020.6.4【Tags: HEVC SCC】 1、参考网址 2、SCC简介 3、HEVC-SCC核心技术

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 4805

Vue3 - 详细实现调用浏览器摄像头拍照并生成图片预览,支持将抓拍的图像保存到用户本地或上传到服务器、调取前置摄像头和后置摄像头,开启摄像头并进行拍照,vue实现调用摄像头,电脑或手机调用摄像头拍照

vue3,nuxt3,摄像头,vue3网站打开摄像头拍照,vue3项目调用摄像头实现拍照功能,拍照后怎么保存,照相后上传到后端服务器,开启摄像头黑屏,如何默认后置摄像头,网页开启电脑摄像头并照相,前置拍照,vue3如何调用手机摄像头进行拍摄,拒绝权限后不再弹出了,微信公众号网页,摄像头报错,拍照左右镜像反了,浏览器不兼容怎么办,vue3调用电脑端摄像头实时拍照,解决调用摄像头权限无法弹出,打不开摄像头,Vue3如何调用手机的摄像头,调用本地摄像头实现拍照,浏览器不弹摄像头权限了,如何不使用https运行测试

🏆 前端领域优质创作者 8654

3-1 写出派生类构造方法(Java)

裁判测试程序样例中展示的是一段定义基类People、派生类Student以及测试两个类的相关Java代码,其中缺失了部分代码,请补充完整,以保证测试程序正常运行。 函数接口定义: 提示: 观察类的定义和main方法中的测试代码,补全缺失的代码。 裁判测试程序样例: 注意:真正的测试程序中使用的数据可能与样例测试程序中不同,但仅按照样例中的格式调用相关方法(函数)。 class Pe...

BOKEhhh的博客 9103

EZ-INSAR工具箱(使用历史问题)

把 rasterio 升到 1.3+(或退回 py39)→features能 import → 脚本能跑 → 出图 → MATLAB 不再报错!

2301_79258000的博客 121

java多线程实现方法

目录方法1:继承Thread类方法2:实现 Runnable接口 方法1:继承Thread类 子类继承:Thread类具备多线程能力 启动线程:子类对象.start() 不建议使用:避免OOP单继承局限性 //方法1:继承Thread, 重写run()方法, 调用start()开启线程 public class TestThread1 extends Thread{ @Override public void run(){ for (int i = 0; i <

qq_24433919的博客 137

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【Java多线程】多线程的三种实现方式和多线程常用方法

在main()方法中,你可以创建和启动额外的线程,这些线程称为子线程。子线程可以并行执行,与主线程同时进行。多线程的三种实现方式如下: 继承Thread类的方式进行实现 实现Runnable接口的方式进行实现 利用Callable接口和Future接口方式实现

m0_65277261的博客 5094

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java 实现多线程的n种方法

线程是操作系统中最小的执行单元。它包含了程序执行的顺序、调用栈、寄存器等资源。一个进程可以包含多个线程,每个线程共享进程的资源(如内存、文件句柄等),但有自己的独立执行路径。Callable接口是Java 5引入的一个功能更强的接口,它允许在执行完任务后返回结果,并且可以抛出异常。@Override// 线程执行的代码return 123;try {// 获取线程返回的结果如果需要更灵活的线程池配置,可以使用类自定义线程池。i < 10;i++) {

繁依Fanyi的博客 1674

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

多线程开发实战:Java实现多线程四种方式及相关方法原理

本文带大家了解Java实现多线程的四种方法以及实现多线程的重要注意事项和难点!

陈橘又青的博客 3万+

java多线程有几种实现方法_java 多线程的几种实现方法总结

java 多线程的几种实现方法总结1.多线程有几种实现方法?同步有几种实现方法?多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与notifywait():使一个线程处于等待状态,并且释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉Interrupte...

weixin_39938331的博客 317

java多线程的两种实现方法

进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销。 线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。所以线程是轻量级的任务,它们之间的通信和转换只需...

jdbfvhxx的博客 713

Java实现多线程的三种方法

继承Thread类的方式进行实现 实现步骤 定义一个类MyThread继承Thread类 在MyThread类中重写run0方法 public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("thread is opened..." + i); }

Hubuers的博客 1989

Java多线程【三种实现方法】

java多线程 并发与并行 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行 并行:一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。 对比:并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行) 进程与线程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作

HongYu012的博客 5065

java多线程实现的方法

一、在学习多线程这块内容时,我们首先一个知道什么叫进程?什么叫线程?它们之间有何关系、有何区别? 进程: 操作系统中一个程序的执行周期称为一个进程。 线程: 一个程序同时执行多个任务。通常,每一个任务就称为一个线程。 关系: 没有进程就没有线程,进程一旦终止,其内的线程也将不复存在 多进程与多线程区别: 本质区别在于,每个进程拥有自己的一整套变量,而线程则共享数据。共享变量使得线程之 间的通信比进...

qq_42321594的博客 1095

java多线程有几种实现方法_java实现多线程的方法

其实有很多种方法,但是出于学习,我只介绍其中两种最常用的方法。继承Thread类,重写Run()方法,创建多线程。实现Runnable接口,重写Run()方法,创建多线程。我们就以车站的售票系统为例介绍两种方法的异同。车站的各个售票口相当于各个线程。当做这个系统的时候可能会使用上述两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果。方法一:继承Thre...

weixin_29359515的博客 119

Java实现多线程到底有多少种方法?

可以去百度一下,答案有很多。 到底有

kaven 5299

Java:多线程 的三种实现方法

本文详细介绍了java中多线程的三种实现方法,包含原理、例子、代码以及我自己的理解等,保证一看就懂。

Cosmoshhhyyy的博客 473

java多线程同步的四种方法_java中实现多线程的两种方法

java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类;2.实现runnable接口;同步的实现方法有五种:1.同步方法;2.同步代码块;3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步 。JAVA多线程有哪几种实现方式JAVA多线程实现方式主要有三种:继承Thread类、实现Ru...

weixin_36409041的博客 2060
上一篇: Apache日志分析工具Awstats的安装和配置
下一篇: PHP中常用的缓存技术介绍
HackProgramer
博客等级 码龄12年 255粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值