Java第十次课-多线程

Oracle数据库RMAN异机恢复保姆级教程,按照步骤来操作,一次就成功! 本文深入解析RMAN异机恢复四大核心场景(演练、数据恢复、故障应急、测试环境搭建),提供从备份到验证的完整步骤和实战脚本。包含RAC到单机迁移技巧、路径调整、常见报错解决方案,助你彻底掌握数据库恢复的“救命技能”。DBA必备干货,强烈推荐 阅读详情

 第8章
多线程

本章目录
8.1 并发性、线程与多线程
8.2 获得线程体的两种方法
8.3 线程调度

8.1 并发性、线程与多线程
一、并发性的概念
目前的计算机操作系统大多支持并发性,即多个进程是交叉执行的,一般称多进程为系统级并发。
Java语言通过程序控制流来执行程序,单个的一段程序执行控制流称为线程。
多线程指的是在单个程序内部可以同时运行多个相同或不同的线程来执行不同的任务。
线程与操作系统中的进程有些相似,同一时刻操作系统中可以有多个进程在运行,但是线程则更进一步,将并发推进到语言级,所以说Java语言支持语言级并发。
在单个程序内部也可以在同一时刻有多个线程在进行不同的运算。
多线程也需要系统通过分配处理器的运行时间进行调度以提高整个程序的运行效率。

二、线程的状态与生命周期

一个线程在其生命生存时段内的任一时刻都处于某一种线程状态,线程在从其生命开始到结束的时间内将可能经历从出生态到死亡态的多种状态,这构成了它的生命周期。
线程的状态包括以下7种:
出生态(Born state),也称为新线程(New Thread)。
就绪态(Ready state),也称为可运行线程(Runnable Thread)。
运行态(Running state)。
休眠态(Sleeping state)。
等待态(Waiting state)。
阻塞态(Blocked state)。
死亡态(Dead state)。
特别的线程关系:两个线程的“依赖” 关系。
8.2 获得线程体的两种方法
线程从根本上讲是一段程度代码序列,还需要在程序中实现。
java.lang包中定义了Thread类,是Java语言多线程程序设计的基础和关键。
Thread类是java.lang.Object类的直接子类,其中定义的一些方法成员完成与线程有关的操作:
interrupt()                        //中断线程
join()                             //等待该线程终止
join(long millis)                  //等待该线程终止,在指定的毫秒数内
join(long millis, int nanos)       //等待该线程终止,在指定的毫秒数加指定的纳秒数内
sleep(long millis)                 //休眠当前正在执行的线程,在指定的毫秒数内
sleep(long millis, int nanos)       //休眠当前正在执行的线程,在指定的毫秒数加指定的纳秒数内
start()                            //使该线程开始执行
yield()                            //暂停当前正在执行的线程,并执行其他线程
notify()                           //唤醒在此对象监视器上等待的单个线程
notifyAll()                        //唤醒在此对象监视器上等待的所有线程
wait()                             //导致当前的线程等待
wait(long timeout)                 //导致当前的线程等待timeout毫秒
wait(long timeout, int nanos)      //导致当前的线程等待timeout毫秒加nanos纳秒
isAlive()                          //测试线程是否处于活动状态
isInterrupted()                    //测试线程是否已经中断
getPriority()                      //返回线程的优先级
getId()                            //返回线程的标识符
getName()                          //返回线程的名称
getState()                         //返回线程的状态
setPriority(int newPriority)       //更改线程的优先级
setName(String name)               //改变线程名称,使之与参数name相同
Java语言支持多线程,线程在Application程序和Applet程序中都可以使用,在Applet中使用得更普遍一些。
线程的行为由线程体确定,线程体是线程的主体,含有线程的具体内容。
Java语言程序中实现线程的程序设计的关键是使主程序获得run()方法并重写run()方法,重写了run()方法也就定义了线程体。
根据获得run()方法的途径不同,定义线程体有两种完全等价的方式。
一、通过继承Thread类获得线程体
在java.lang.Thread类中定义有run()方法,可以在当前程序中通过继承Thread类间接继承run()方法,并在程序中重写该方法而构造出线程体。
二、通过实现Runnable接口获得线程体
在java.lang包中定义有一个接口Runnable,其中只有一个run()方法,可以在当前程序中实现该接口并重写该方法而构造出线程体。这种方法比较多见于编写Applet程序,当一个

Applet程序的线程体必须要在主类中实现的时候,就别无选择地要使用实现Runnable接口的方法,与前一种方法相比,这种方法的效果是一样的。
多个线程同时在一个程序中执行,要通过系统的线程调度获得处理器才能执行,所以完全可能出现一个线程还没有执行完就被迫停下来而由另一个线程取而代之获得处理器的情况

,所以就会出现同一个线程所执行的内容的顺序是固定的,而多个线程的执行内容的顺序就可能出现不同的组合的结果,这种现象称为线程的不确定性。
//Example 1 of Chapter 8

import java.awt.*;
import javax.swing.*;

public class MultiThreadDemo1 extends JFrame
{
 private ScrollPane scrollPane;
 private JTextArea area;
 
 public MultiThreadDemo1()
 {
  super( "多线程输出演示" );
  getContentPane().setLayout( new BorderLayout() );
  scrollPane = new ScrollPane();
  area = new JTextArea();
  area.setEditable( false );
  scrollPane.add( area );
  getContentPane().add( scrollPane, BorderLayout.CENTER );
  
  OutputThread no1 = new OutputThread( "Number1" );
  OutputThread no2 = new OutputThread( "Number2" );
  OutputThread no3 = new OutputThread( "Number3" );
  
  area.append( "主程序启动/n" );
  
  no1.start();
  no2.start();
  no3.start();
  
  area.append( "主程序结束/n" );
  
  setSize( 300, 240 );
  setVisible( true );
 }
 
 public static void main(String[] args)
 {
  MultiThreadDemo1 demo = new MultiThreadDemo1();
  demo.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
 }
 
 private class OutputThread extends Thread
 {
  private int sleepTime;
  
  public OutputThread( String name )
  {
   super( name );
  }
  
  public void run()
  {
   try {
    sleepTime = ( int ) ( Math.random() * 2000 );
    area.append( getName() + ":即将休眠" + sleepTime + "毫秒/n" );
    Thread.sleep( sleepTime );
    sleepTime = ( int ) ( Math.random() * 2000 );
    area.append( getName() + ":即将再次休眠" + sleepTime + "毫秒/n" );
    Thread.sleep( sleepTime );
   }
   catch ( InterruptedException exception )
   {
    exception.printStackTrace();
   }
   area.append( getName() + ":结束运行/n" );
  }
 }
}
8.3 线程调度
一、线程的优先级
每个线程都有自己的优先级。当Java线程被创建时,该线程从父线程中继承优先级并保持一致。线程被创建后,可以改变线程的优先级。
线程的优先级定义为10级,分别用数字1到10表示。

在Thread类中还定义了几个描述线程的优先级的字段:
最高优先级MAX_PRIORITY对应10级,
默认优先级NORM_PRIORITY对应5级,
最低优先级MIN_PRIORITY对应1级。
//Example 2 of Chapter 8

import java.awt.*;
import javax.swing.*;

public class MultiThreadDemo2 extends JFrame
{
 private ScrollPane scrollPane;
 private JTextArea area;
 
 public MultiThreadDemo2()
 {
  super( "多线程输出演示" );
  getContentPane().setLayout( new BorderLayout() );
  scrollPane = new ScrollPane();
  area = new JTextArea();
  area.setEditable( false );
  scrollPane.add( area );
  getContentPane().add( scrollPane, BorderLayout.CENTER );
  
  OutputThread no1 = new OutputThread( "Number1" );
  OutputThread no2 = new OutputThread( "Number2" );
  OutputThread no3 = new OutputThread( "Number3" );
  no1.start();
  no2.start();
  no3.start();
  
  setSize( 240, 400 );
  setVisible( true );
 }
 
 public static void main(String[] args)
 {
  MultiThreadDemo2 demo = new MultiThreadDemo2();
  demo.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
 }
 
 private class OutputThread extends Thread
 {
  public OutputThread( String name )
  {
   super( name );
  }
  
  public void run()
  {
   for(int i=5; i>0; i--)area.append( "( "+i+" )这是线程" + getName() + "/n" );
   area.append( "退出线程" + getName() + "/n" );
  }
 }
}

线程的优先级的作用是方便操作系统调度线程,操作系统总是让优先级高的线程先于优先级低的线程执行。
对于优先级相同的线程,在不采用分时技术的操作系统中总是让一个线程一直运行直到完成任务,除非它自己转化为休眠态、等待态或阻塞态;在采用分时技术的操作系统中每个

线程都将获得称为时间片的处理器运行时间以使线程能够运行。

可以通过调用Thread类的getPriority()方法获取线程的优先级,setPriority()方法更改线程的优先级。
//Example 3 of Chapter 8

import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
import java.util.Date;

public class MultiThreadDemo3 extends Applet implements Runnable
{
 Thread clockThread;
 
 public  void  start()
 {
  if(clockThread==null)
  {
   clockThread = new Thread( this, "Clock" );
   clockThread.start();
  }
 }
 
 public void run()
 {
  while(clockThread!=null)
  {
   repaint();
   try{
    clockThread.sleep(1000);
   }
   catch ( InterruptedException exception )
   {
    exception.printStackTrace();
   }
  }
 }
 
 public void paint( Graphics g )
 {
  Date now = new Date();
  g.setFont( new Font( "Dialog", Font.PLAIN, 60 ) );
  g.drawString( now.getHours() + ":" + now.getMinutes() +
   ":" + now.getSeconds() , 5 , 80);
 }
 
 public void stop()
 {
  clockThread.stop();
  clockThread = null;
 }
}
二、线程同步
线程在访问共享对象时不允许其它线程访问该对象的情况称为线程互斥或线程同步。线程同步与计算机操作系统中的进程同步很相似。
Java语言采用监控器机制来实现线程同步,监控器机制也称为获得锁。

在Java语言中为每个对象都设置了一个监控器,监控器每次只允许一个线程来执行对象的同步语句,当程序控制流进入同步语句时,将对象锁住,从而实现线程同步。
任意一个时刻如果有多条语句试图使对象同步则只能有一条同步语句被激活,其它所有试图对同一对象实现同步的线程都将被迫处于阻塞态。
当实现线程同步的语句完成执行过程之后,监控器才会打开对象的锁并按照线程调度原则处理其它的同步语句,分配处理器时间。


在Java语言程序设计中,可以采用“synchronized
”关键字实现同步方法,具体用法就是在程序中进行方法定义时用“synchronized
”关键字说明方法,使得方法具有同步属性,任一时刻只有一个线程能够调用带有同步属性的方法。
还可以在程序中使用wait()方法使一个暂时没有获得完全的条件,无法对该对象继续执行任务的线程进入等待态。

当一个线程完成了自己的同步语句并执行完自己的代码使得其它的线程所等待的条件得以满足之后,也可以通过使用notify()方法将一个正处于等待态的线程再次转为就绪态。也

可以通过使用notifyAll()方法将所有处于等待态的线程再次转为就绪态。
转为就绪态的线程都有机会获得对象的锁,但是任一时刻最多只能有一个线程获得对象的锁,其余的线程都将处于阻塞态。

有几个问题是在编写线程同步程序时应该注意的:
 ⑴当对象的锁被释放时,阻塞线程调用一个用“synchronized”关键字说明的方法并不保证一定就能立刻成为下一个获得锁的线程。
 ⑵调用了监控器的wait()方法成为等待态的线程经由其它线程调用notify()方法之后并不保证一定会脱离等待态。
 ⑶在同步方法中建议在wait()方法之前调用notifyAll()方法唤醒所有等待态线程,包括该线程自身,而将同步线程的控制选择权交由标记变量控制。


 ⑷使用
while(!条件)……wait()……notify()
结构来完成同步方法的定义,这样做要比使用
if(!条件)……wait()……notify()
结构来完成定义要安全。
 ⑸不要在线程同步的程序中调用sleep()方法,这样做通常是错误的。
 ⑹wait()方法通常要抛出中断异常InterruptedException,所以在wait()方法外部要进行捕获和处理异常的操作。

//Example 4 of Chapter 8

import java.awt.*;
import javax.swing.*;

public class MultiThreadDemo4 extends JFrame
{
 private ScrollPane scrollPane;
 private JTextArea area;
 
 public MultiThreadDemo4()
 {
  super( "线程同步演示" );
  getContentPane().setLayout( new BorderLayout() );
  scrollPane = new ScrollPane();
  area = new JTextArea();
  area.setEditable( false );
  scrollPane.add( area );
  getContentPane().add( scrollPane, BorderLayout.CENTER );
  
  DataProcesse dataprocesser = new DataProcesse();
  Provider provider = new Provider( dataprocesser );
  Comparer comparer = new Comparer( dataprocesser );
  provider.start();
  comparer.start();
  
  setSize( 240, 400 );
  setVisible( true );
 }
 
 public static void main(String[] args)
 {
  MultiThreadDemo4 demo = new MultiThreadDemo4();
  demo.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
 }
 
 private class Provider extends Thread
 {
  private DataProcesse processer;
  public Provider( DataProcesse dp )
  {
   super( "提供者" );
   processer = dp;
  }
  
  public void run()
  {
   for ( int i = 0; i <= 4; i++ )
   {
    processer.set( i );
   }
   area.append( getName() + "提供完数据/n" );
  }
 }
 
 private class Comparer extends Thread
 {
  private DataProcesse processer;
  public Comparer( DataProcesse dp )
  {
   super( "处理者" );
   processer = dp;
  }
  
  public void run()
  {
   double sum = -30.0;
   for ( int i = 0; i <= 4; i++ )
   {
    double a = processer.get();
    if(sum < a)sum = a;
   }
   area.append( getName() + "读到的最大数据是" + sum + "/n" );
  }
 }
 
 class DataProcesse
 {
  private double buffer;
 private boolean flag = false;
  public synchronized void set( double value )
  {
   notifyAll();
   while ( flag == true )
   {
    try{
    area.append( "缓存中有数据," + Thread.currentThread().getName() + "等待/n" );
    wait();
    }
    catch ( InterruptedException exception )
    {
     exception.printStackTrace();
    }
   }
   buffer = value;
   flag = true;
   area.append( Thread.currentThread().getName() + "写入" + buffer + "/n" );
   notify();
  }
  
  public synchronized double get()
  {
   notifyAll();
   while ( flag == false )
   {
    try{
    area.append( "缓存中无新数据," + Thread.currentThread().getName() + "等待/n" );
    wait();
    }
    catch ( InterruptedException exception )
    {
     exception.printStackTrace();
    }
   }
   flag = false;
   area.append( Thread.currentThread().getName() + "读出" + buffer + "/n" );
   notify();
   return buffer;
  }

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面 本文详细介绍了如何使用SpannableStringBuilder在Android平台上构建专业级AI对话界面,涵盖流式文本处理、富文本解析、交互优化等核心技术。通过实战代码示例,帮助开发者实现类似DeepSeek的AI产品交互效果,提升用户体验和应用专业度。 阅读详情

相关推荐

利用DRONEKIT-SITL + MAVPROXY + QGroundControl模拟飞行

dronekit: 一种用于无人机控制的python库。 dronekit-sitl:一种本地仿真工具,相当于本地虚拟化了一个无人机。 mavproxy:数据转发软件(类似于插线板的感觉,一个输入,多个相同的输出)。打开一个Anaconda prompt 首先激活相应的环境 然后运行如下命令: 保持2中的Anaconda prompt处于运行状态,另打开一个Anaconda prompt窗口,运行如下命令: tcp:127.0.0.1:5760: SITL默认端口,作为mavproxy的输入,把输入数据转发

Done___的博客 4344

第12章 多线程

第12章 多线程

m0_65594779的博客 1217

解决vscode无法运行npm命令的问题(cmd可行)

Powershell以及vscode中npm命令使用不了

无痕坚守本心的博客 2750

HFUT Java作业四之GUI和字符流实现学生成绩计算储存系统(附详解和完整代码)

一、作业内容 使用字符流和GUI类,编程实现以下功能 (1)设计图形化界面,至少包括文本类控件类。接受从键盘输入姓名、学号、成绩并保存到文本文件中,可重复进行。 (2)从文件中读取各学生的成绩,并计算所有学生成绩的平均值、最大值和最小值,排序后输出到另一文本 二、作业分析 ...

少渊的博客 1898

斯坦福大学CS224d基础1:线性代数知识

本文为斯坦福CS229的内容,也是CS224d课程的背景数学知识。概括了在机器学习和深度学习中用到的大部分线性代数知识。为了便于大家查漏补缺,这里根据英文版本整理了一个中文版本。

龙心尘 2万+

2025-E题国一-简易自行瞄准装置:基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计

本文详细介绍了2025年全国大学生电子设计竞赛E题一等奖作品——基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计。该系统通过地猛星主控实现小车巡线,天猛星主控驱动云台,结合K230开发板的视觉识别能力,构建了一套完整的视觉巡线云台系统,实现了自动巡线与精准瞄准功能。文章深入剖析了硬件选型、双闭环PID控制算法、视觉识别与目标跟踪等核心技术,并分享了系统调试与避坑经验。

weixin_42596011的博客 675

JTextPane和JTextArea,禁用(setEditable(false))后,显示光标,并且鼠标为文本光标...

JTextPane和JTextArea,禁止编辑(setEditable(false))后,显示光标,并且鼠标为文本光标   JTextArea logTxtArea = new JTextArea(); //禁止编辑 logTxtArea.setEditable(false); //设置鼠标为文本鼠标 logTxtArea.setCursor(new Cursor(Cursor.TE...

万里浮云的专栏 5431

首个基于LBS方案的3D传感器,VoxelSensor解析

该传感器将结合OQmented的Lissajous模式的MEMS扫描镜,与每帧逐行工作的光栅扫描相比,Lissajous轨迹扫描速度更快,并且能耗很低,它可以更快地捕获完整的场景和快速移动,并且需要更少的数据处理,可满足AR/VR对于低延迟、高效率的需求。简单来讲,Switching Pixels的区别是专注于识别激光事件,性能比普通事件相机更好,但也可以使用事件相机的算法。在具体应用中,它需要在X和Y方向发射一个或多个脉冲光束,以在X和Y轴上定位,而Z轴,也就是深度,则是通过计算光返回的时间来测量。

qingtingwang的博客 576

JavaEE基础第8章多线程

在idea中一个工程Project开一个窗口,每个工程有不同的Module 比如京东商城一个项目,不同的Module相当于不同的功能模块,如秒杀模块等等。 也就是说如果在创建一个淘宝商城需要再新打开一个窗口即新建一个Project idea中最顶级的就是Project,工程,一个窗口只能有一个工程,打开另一个工程只能用新的窗口 第八章多线程 概述 内存图 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程(process)是程序的**一次执行过程

记录学习过程中的笔记 330

YOLOv11改进 | 特殊场景检测篇 | 利用图像去雾网络UnfogNet改进yolov11图像雾天检测能力(全网独家首发改进)

本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv11针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv11的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可以忽略不计这是非常难得的,因为其也算是一种图像增强算法,同时本文的内容不影响其它的模块改进可以作为工作量凑近大家的论文里,非常的适用,图像去雾检测为群友最近提出的需要的改进。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 1629

mapbox 从入门到精通 - 目录

欢迎大家来到gis分享者的《mapbox 从入门到精通》专栏。博主列出学习大纲,如果有什么问题,欢迎留言。

我哎GIS博客 5847

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品。转载请注明出处http://blog.youkuaiyun.com/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解) 目录 一扩...

zqzwzd的博客 287

图像分割 - 使用Mask R-CNN模型在COCO数据集上进行图像分割任务

图像分割是计算机视觉领域的一个重要任务,它旨在将图像中的每个像素分类为对象或背景。Mask R-CNN是一种基于区域的卷积神经网络,可用于图像分割任务。它是Faster R-CNN的扩展,将目标检测与图像分割结合起来,能够同时检测和分割对象。在本博客中,我们将使用Mask R-CNN模型在COCO数据集上进行图像分割任务。我们将介绍如何下载和准备COCO数据集,以及如何使用Mask R-CNN模型进行训练和推理。

斌擎科技 1189

Java多线程详解(一)Java多线程入门

最近听很多面试的小伙伴说,网上往往是一篇一篇的Java多线程的文章,除了书籍没有什么学习多线程的一系列文章。但是仅仅凭借一两篇文章很难对多线程有系统的学习,而且面试的时候多线程这方面的知识往往也是考察的重点,所以考虑之下决定写一系列关于Java多线程的文章。文章参考了高老师的《Java多线程编程核心技术》。力争使用最短的篇幅把Java多线程的知识作以系统的讲述。 本节思维导图: 思维导图...

刘成 2475

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java第十次作业--多线程

(一)学习总结 1.用思维导图对java多线程的学习内容进行总结。 2.下面是一个单线程实现的龟兔赛跑游戏。 public class TortoiseHareRace { public static void main(String[] args) { int totalStep = 10; int tortoiseStep = 0; ...

dnyhg80846的专栏 253

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java多线程--深入浅出Java多线程

#深入浅出Java多线程 慕课网对应课程 – 深入浅出Java多线程 Java多线程基础概念 进程 程序(任务)的执行过程 动态性 持有资源(共享内存,共享文件)和线程 线程 线程是系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源 线程的交互 互斥 同步 Java线程的常用方法 演员程序 package com.mooc.actor; public class Actor ex...

Airren's Site 2171

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Java多线程】Java多线程技能

到 1. 进程和多线程的概念及线程的优点 提到多线程这个技术就不得不提及“进程”这个概念,在“百度百科”中对进程的解释如下: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 进程是受操作系统管理的基本运行单元。 那什么是线程呢? 线程可以理解成是在

一定要站在自己热爱的生活里闪闪发光 4万+

Java多线程

多线程知识

m0_59961940的博客 1683

Java技术——Java多线程学习

0.前言 转载请标明出处:http://blog.youkuaiyun.com/seu_calvin/article/details/52400927 学习多线程之前需要先了解以下几个概念。 进程:一般指一个程序运行时的实例,每个进程有自己独立的地址空间。一个进程无法直接访问另一个进程的数据。 线程:是CPU调度的最小单元,一个进程可以有很多线程,每条线程可以并行执行不同的任务。并且每个线程有独立的运...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

Java小白的第32课一一多线程

文章目录多线程1. 程序、进程、线程 多线程 1. 程序、进程、线程 程序: 是计算机指令集合必须依靠操作系统才能存在,文件存储在电脑硬盘上。 进程: 程序运行之后,系统会划分一块空间,每执行一次活动就产生了一个进程。 线程: 线程是程序的最小单位,CPU通过线程来执行进程。 分类: 分时调度: 平均分配CPU的资源,每个线程执行时间是平均的 抢占式调度: 根据每条线程的优先级不同执行的占用的资源也不同,同级线程是随机执行\color{#ff0036}{随机执行}随机执行 三者的关系 : 一个

BrysonMa的博客 279

Java 多线程详解

多线程(Multithreading)是指在一个程序中同时执行多个线程的能力。线程是进程中的一个执行路径,多线程允许程序在同一时间内执行多个操作。Java 中的多线程可以通过并发处理来提高程序的性能和响应速度,尤其在处理复杂计算、大量 I/O 操作或并发任务时非常有用。多线程使得程序可以同时执行多个任务,充分利用CPU资源,提升程序性能,增强响应性,并简化程序的复杂度。尽管多线程编程带来了一些挑战,如线程安全和死锁问题,但合理设计和使用多线程可以显著改善程序的整体表现。

goTsHgo的博客 2040

1、Java 多线程编程 第1课

入门 线程与进程的区别 很多人认为线程就是更小的进程,这是不准确的,线程与进程还是有一些区别的。下面是关于进程和线程的定义。 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数...

qq_39529303的博客 233

JAVA课设-多线程

程序,进程,线程的区别 程序–是指一段静态的代码,指令和数据的有序集合,其本身没有任何运行的含义 进程–是程序的一次动态执行过程,它对应于从代码加载、执行到执行完毕的一个完整过程 线程—是比进程更小的执行单位。一个进程在执行的过程中,可以产生多个线程,形成多条执行线索。每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。 多进程和多线程 Thread类的几种方法...

weixin_45774350的博客 335

java多线程

在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。操作系统调度的最小任务单位其实不是进程,而是线程。

m0_60301012的博客 775

慕课网java多线程课程笔记

第一章 多线程背景知识介绍 进程: 线程:线程间具有互斥性和同步性 线程是系统中最小的执行单元 同一进程中有多个线程 线程共享进程资源 一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱...

Wendy_He023的博客 417
上一篇: 计算机图形学第五章---基本图形生成算法
下一篇: Java第十一次课-网络编程
flyuniverse_shell
博客等级 码龄18年 119粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值