初识java多线程

35:Java多线程:初识Java多线程 本文是java多线程的一个入门的基础知识。首先需要记住这两个单词:Process进程、Thread线程,在说进程和线程之前,还必须说一下 :程序,这个词。程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。听起来很抽象,这里为了好理解可以将这里的理解为我们写的。代码没有运行就是死的是静态的。进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。 阅读详情

一、创建多线程的方法一:

创建java.lang.Thread的子类,重写该类的run方法

基本用法例子:

public class ThreadTest1 {
  public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 1、创建一个线程对象
        Thread thr = new FirstThread(); 
        // 2、调用线程对象的start()方法启动线程
        thr.start();
        String threadName = Thread.currentThread().getName();
            for (int i = 0; i < 100; i++){
                System.out.println(threadName + ": " + i);
            }
    }
}
//继承Thread类
class FirstThread extends Thread{
/*
* 线程体在run()方法中
*/
public void run(){
    // 显示当前线程名称
    String threadName = Thread.currentThread().getName();
        for (int i = 0; i < 100; i++){
        System.out.println(threadName + ": " + i);
        }
    }
}
//输出结果为:
main: 0
Thread-0: 0
Thread-0: 1
main: 1
main: 2
Thread-0: 2
main: 3
Thread-0: 3
Thread-0: 4
...
0~99 输出了两遍


思考一下如何去实现两个线程共享一个变量?
1. 思路一:是用static静态化一个变量


public class PrintNumber {
   public static void main(String[] args){
       Thread thread1 = new PrintThread("thread1");
       Thread thread2 = new PrintThread("thread2");
       thread1.start();
       thread2.start();
   }
}
class PrintThread extends Thread{
   private static int i;
   public PrintThread(String name){
       super(name);
   }
   public void run(){
       for (i = 0; i < 100; i++){
          System.out.println(getName() + ": " + i );
       }
   }
}

2.思路二: 传递一个对象给一个进程,通过对象在进程中共享数据


public class PrintNumber {
   public int i;
   public static void main(String[] args){
       PrintNumber pn1 = new PrintNumber();// 需要传递给进程的对象
       Thread thread1 = new PrintThread("thread1", pn1);
       Thread thread2 = new PrintThread("thread2", pn1);
       thread1.start();
       thread2.start();
   }
}
class PrintThread extends Thread{
   PrintNumber pn;
   public PrintThread(String name, PrintNumber pn){
       super(name);
       this.pn = pn;
   }
   public void run(){
       for (pn.i = 0; pn.i < 100; pn.i++){
          System.out.println(getName() + ": " + pn.i );
       }
   }
}



二、创建多线程的方法二:

实现Runnable接口的方式:

1、创建实现Runnable接口的实现类:必须实现run()方法

2、创建第一步那个实现类的实例对象
3、利用Thread(Runnable target)构造器,创建Thread对象

4、调用Thread类的start方法调用线程

例子:

//实现MyRunnbale是Runnable的实现类
public class MyRunnable implements Runnable {
    public static int i = 0;
    @Override
    // 实现run方法
    public void run() {
        for (; i < 100; i++){
            System.out.println(Thread.currentThread().getName() + ":  " + i);
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyRunnable mr = new MyRunnable();
        Thread th1 = new Thread(mr);
        Thread th2 = new Thread(mr);
        th1.start();
        th2.start();
    }
}



三、线程的生命周期

线程的生命周期指的是线程从启动,直到结束
可以调用Thread类的相关方法影响线程的运行状态

线程的运行状态有:

  • 新建(new)
  • 可执行(Runnable)
  • 运行(Running)
  • 阻塞(Blocking)
  • 死亡(Dead)

新建状态

当新建了一个Thread对象时,该进程处于新建状态,没有启动,所以无法执行

可执行状态

其他线程调用了处于新建状态线程的start方法,该线程对象转换到“可执行状态”
线程拥有获得cpu的权利,处于等待调度阶段

运行状态

处于可执行状态的线程一旦获得cpu的控制权,就会转换到运行状态,
在执行状态下,线程状态占用cpu时间片段,执行run方法中的代码,处于执行状态下的线程可以调用yield方法,该方法用于主动让出cpu控制权。线程对象让出控制权后,回到可执行状态,重新等待调度;

阻塞状态

线程在执行状态下,由于某种条件影响,会被迫让出cpu控制权,进入“阻塞状态”
进入阻塞状态有三种情况:
- 调用sleep 方法:
Thread的sleep方法能让线程暂止休眠一段时间,单位是毫秒


实际例子:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (int i = 0; i < 10; i++){
            System.out.println(Thread.currentThread().getName() + ":  " + i);
            try {
                // Thread的sleep方法能让线程暂止休眠一段时间,单位是毫秒

                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyRunnable mr = new MyRunnable();
        Thread th1 = new Thread(mr);
        th1.start();
    }
}
  • 调用join方法
    处于执行状态的调用了其他线程的join方法,将会挂起,进入阻塞状态
    目标线程执行完毕后,才能解除阻塞,回到可执行状态;

public class ThreadJoin extends Thread{
    public void run(){
        for (int i = 0; i < 10; i++){
            System.out.println(getName() + ": " + i);
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ThreadJoin thread = new ThreadJoin();
        thread.start();
        for (int i = 0; i < 10; i++){
            System.out.println(Thread.currentThread().getName() + ": " + i);
            if (i == 5){
                try {
                    thread.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
// 输出结果;
main: 0
Thread-0: 0
main: 1
main: 2
Thread-0: 1
main: 3
main: 4
Thread-0: 2
main: 5
Thread-0: 3
Thread-0: 4
Thread-0: 5
Thread-0: 6
Thread-0: 7
Thread-0: 8
Thread-0: 9
main: 6
main: 7
main: 8
main: 9
  • 执行I/O操作



    解除阻塞状态有三种情况:

  • 睡眠超时
  • 调用join后等待其他线程执行完毕
  • I/O操作完毕
  • 调用堵塞线程的interrupter方法(线程睡眠时,调用该方法会抛出InterrupterException)

public class Interrupter extends Thread {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Interrupter interrupter = new Interrupter();
        interrupter.start();
        interrupter.interrupt(); //解除线程的堵塞状态
    }

    public void run(){
        for (int i = 0; i < 10; i++){
            System.out.println(getName() + ": " + i);
            if (i == 5){
                try {
                    Thread.sleep(100000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
执行结果:
Thread-0: 0
Thread-0: 1
Thread-0: 2
Thread-0: 3
Thread-0: 4
Thread-0: 5
java.lang.InterruptedException: sleep interrupted //这是提示运行时异常
Thread-0: 6
Thread-0: 7
Thread-0: 8
Thread-0: 9
    at java.lang.Thread.sleep(Native Method)
    at Interrupter.run(Interrupter.java:15)



死亡状态

处于执行状态的线程一旦从run()方法返回,无论是正常退出还是抛出异常,就会进入“死亡状态”;

已经死亡的线程不能重新运行,否则会抛出异常illegalThreadStateException

可以使用Thread类的isAlive方法判断线程是否活着;



四、线程的优先级

  • Thread类提供了设置和获取当前优先级的方法:

    setPriority();设置优先级不一定起作用,在不同的JVM、操作系统上,效果不同,操作系统不能保证设置了优先级的线程会优先执行或者获得更多的cpu时间

    getPriority();
  • Java设置了10个优先级,1~10;1最低,10最高,主线程默认优先级为5;
  • 三个代表优先级的常量:MIN_PRIORITY、MAX_PRIORITY、NORM_PRIORITY,分别代表1、10、5

public class PriortityTest extends Thread{
    public PriortityTest(String name) {
        // TODO Auto-generated constructor stub
        super(name);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PriortityTest priThread0 = new PriortityTest("线程一"),
                      priThread1 = new PriortityTest("线程二1");
        System.out.println(priThread0.getPriority());// 5
        System.out.println(priThread1.getPriority());// 5
        priThread0.setPriority(MIN_PRIORITY);//值为10,The maximum priority that a thread can have.
        priThread1.setPriority(MAX_PRIORITY);
        priThread0.start();
        priThread1.start();
    }
    public void run(){
        for (int i = 0; i < 10; i++){
            System.out.println(getName() + ": " + i);
        }
    }
}



五、线程共享以及安全问题:

首先来看个例子:有五个苹果,两个线程同时拿苹果,每拿一个,打印谁拿了,剩下几个; 利用多线程,两个线程共享资源appleCount,这样在其中一个线程拿完一个苹果后,还没来的及打印,第二个线程已经将appCount--;所以会导致打印剩下的苹果时出现错位;


public class ShareApple implements Runnable{
    private int appleCount = 5;
    boolean getApple(){
        if (appleCount > 0){
            appleCount--;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "拿走一个苹果," + "剩" + appleCount);
            return true;
        }
        return false;
    }
    public void run(){
        boolean flag = getApple();
        while (flag){

          flag = getApple();
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       ShareApple sa = new ShareApple(); 
       Thread th1 = new Thread(sa);
       Thread th2 = new Thread(sa);
       th1.setName("shao");
       th2.setName("jinghong");
       th1.start();
       th2.start();
    }
}

//输出结果为:
shao拿走一个苹果,剩3
jinghong拿走一个苹果,剩3
shao拿走一个苹果,剩1
jinghong拿走一个苹果,剩1
shao拿走一个苹果,剩0


使用synchronized代码块解决线程安全问题

需要在synchronized代码块参照线程共同的对象:

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;

synchornized(){
    //...
}
  1. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
public synchronized void method(){
    // ...
}
  1. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
public synchronized static void method() {
   // todo
}
  1. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
class ClassName {
   public void method() {
      synchronized(ClassName.class) {
         // todo
      }
   }
}

synchronized关键字,确保共享资源只能在同一个时刻被一个线程访问,这种处理机制称为线程同步,或者线程互斥,基于“对象锁”的概念


public class ShareApple implements Runnable{
    private int appleCount = 5;
    boolean getApple(){
        synchronized(this){
            // this是一个共同的参照对象,这里指的是同一个ShareApple对象
            if (appleCount > 0){
                appleCount--;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "拿走一个苹果," + "剩" + appleCount);
                return true;
            }
            return false;
        }
    }
    public void run(){
        boolean flag = getApple();
        while (flag){
          flag = getApple();
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       ShareApple sa = new ShareApple(); 
       Thread th1 = new Thread(sa);
       Thread th2 = new Thread(sa);
       th2.setName("shao");
       th1.setName("jinghong");
       th1.start();
       th2.start();
    }
}



线程通信

当一个线程在使用同步方法的某个参数时,而此变量又需要其他线程修改后才能符合本线程的需要,那么可以在线程中添加wait()方法;

相关方法:wait(), notify(), notifyAll();
这些方法必须在同步方法中调用。

例如:有如下情景,刘关张三个买票,售货员只有一张5元,张飞拿20元,刘备、关羽各拿五元,当张飞买票时,售货员会说:”没有足够多的零钱,需要等待后面的人买票后有零钱之后才能把票卖给你”;


public class Ticket implements Runnable{


    private int fiveCount = 1, tenCount = 0, twentyCount = 0;

    public synchronized void buy(){
        String name = Thread.currentThread().getName();
        if ("张飞".equals(name)){
           if (fiveCount < 3){
            try {
                System.out.println("没有足够多的零钱,需要等待有零钱之后才能把票卖给张飞");
                wait();
                System.out.println("卖给张飞一张票,并给他找零");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           }
        } else if ("关羽".equals(name)){
            System.out.println("关羽给售票员一张五元");
            fiveCount ++; //关羽给售票员一张五元
        } else if("刘备".equals(name)){
            System.out.println("刘备给售票员一张五元");
            fiveCount ++;// 刘备给售票员一张五元
        }
        // 唤醒进程的条件
        if (fiveCount == 3){
            notifyAll();
        }
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        buy();
    }
    public static void main(String[] args){
        Ticket ticket = new Ticket();
        Thread th1 = new Thread(ticket);
        Thread th2 = new Thread(ticket);
        Thread th3 = new Thread(ticket);
        th1.setName("张飞");
        th2.setName("关羽");
        th3.setName("刘备");
        th1.start();
        th2.start();
        th3.start();
    }
}

//输出结果为:
没有足够多的零钱,需要等待有零钱之后才能把票卖给张飞
刘备给售票员一张五元
关羽给售票员一张五元
卖给张飞一张票,并给他找零


两个线程如何交替打印a-z


public class TrigglePrint implements Runnable{
    char c = 'a';
    public synchronized void  print(){
          System.out.println(Thread.currentThread().getName() + ": " + c);
          notifyAll();
          try {
            wait();
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (; c < 'z'; c++){
         print();
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TrigglePrint tp = new TrigglePrint();
        Thread thread1 = new Thread(tp);
        Thread thread2 = new Thread(tp);
        thread1.start();
        thread2.start();
    }
}
//结果:
Thread-0: a
Thread-1: a
Thread-0: b
Thread-1: c
Thread-0: d
Thread-1: e
Thread-0: f
Thread-1: g
Thread-0: h
Thread-1: i
Thread-0: j
...
...
Shopee App加密算法逆向实战:从抓包到libshpssdk.so的深度解析 本文详细解析了Shopee App加密算法的逆向过程,从网络抓包发现加密参数入手,通过Frida动态Hook定位到Java层关键方法,并深入追踪至Native层的libshpssdk.so核心函数。文章结合实战演示了如何利用Unidbg模拟执行环境进行算法分析与验证,并探讨了核心参数生成逻辑及风控规避要点,为移动安全与逆向工程研究提供了完整的技术路径。 阅读详情

相关推荐

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

11、多线程

多线程的使用

qq_42263859的博客 1089

SwarmClaw:自托管多智能体AI运行时部署与实战指南

多智能体系统是人工智能领域的重要发展方向,它通过多个具备自主决策和协作能力的智能体共同完成任务,其核心原理在于分布式问题求解与协同规划。这种架构在提升任务处理效率、复杂问题分解和鲁棒性方面具有显著技术价值,广泛应用于自动化工作流、虚拟团队协作、智能客服和个性化助手等场景。本文聚焦于SwarmClaw这一自托管的多智能体AI运行时,它原生支持Model Context Protocol,并内置了超过23种AI提供商,为开发者提供了一个开箱即用且高度可定制的控制平面,便于构建和管理复杂的多智能体协作网络。

weixin_27207591的博客 401

多线程-进程、线程、多线程实现方式一:thread类、线程调度、线程控制、生命周期;二:实现Runnable接口;线程安全解决:同步代码块、同步方法;lock锁;线程通信;线程组、线程池、定时器

多线程-进程、线程、多线程实现方式一:thread类、线程调度、线程控制、生命周期;二:实现Runnable接口;线程安全解决:同步代码块、同步方法;lock锁;线程通信;线程组、线程池、定时器

qq_39497997的博客 1001

黑群晖二合一已损毁_手动修复黑群晖已损毁磁盘空间

lz的用法是这样的,一个中古级mac mini 2011上装有vmware esxi 7.6, 然后上面挂载了lz的华芸Asustor Nas的iscsi空间,lz用的是basic volume,然后esxi上面有虚拟的黑群晖6.2.2-24922,黑群晖的docker里跑着不可描述软件,但是发现下载速度过快时,比如有好几个文件同时下载,总速度超过60MB/s以后storage manager里很...

weixin_39669629的博客 1万+

二阶锥松弛在配电网最优潮流计算中的应用(IEEE33节点配电网最优潮流算例matlab程序)(yalmip+cplex)

文献[7]建立了以支路潮流计算为基础的OPF模型,针对OPF中的非凸性约束,采用SOCR技术将其松弛为二阶锥约束,整个 OPF 模型则被转化为二阶锥规划( Second Order Cone Programming,SOCP)问题,对其求解可以得到全局最优解。其次结合辐射型配电网潮流特点建立支路潮流约束,并考虑配电网中的可控单元,包括分布式电源和离散、连续无功补偿装置,建立其出力约束,该模型为非凸非线性模型;式中,αj,t和βij,t分别为t时段内节点i电压的二次方和支路ij电流的二次方。

weixin_47365903的博客 1万+

Java笔记 - 黑马程序员_07(多线程,线程同步,线程池,网络编程入门,UDP通信原理,TCP通信原理,commons-io工具类)

1. 实现多线程 1.1 进程 进程:是正在运行的程序 是系统进行资源分配郑调用的独立单位 每一个进程都有它自己的内存空间和系统资源 1.2 线程 线程:是进程中的单个顺序控制流,是一条执行路径 单线程:一个进程如果只有一条执行路径,则称为单线程程序 多线程:一个进程如果有多条执行路径,则称为多线程程序 举例: 记事本程序 扫雷程序 1.3 多线程的实现方式(方式1) 方式1:继承Thread类 定义一个类MyThread继承Thread类 在MyThread类中重写run()方法 创建MyT

逸乐的博客 1063

基于模糊神经网络实现水质评价预测 - Matlab源码

首先定义输入层、隐含层和输出层的节点数,并初始化权重和阈值,然后开始训练模型,在每轮训练中通过比较模型的输出值与实际值的误差来更新权重和阈值,直到误差达到最小值,为了提高模型的性能,我们可以采用交叉验证等技术进行优化。首先需要准备好数据集,使用的是嘉陵江的水质监测数据集,数据集包含了多个指标,如 pH 值、溶解氧、总氮、总磷等,以及相应的水质等级,我们需要将数据集分为训练集和测试集。在当今环境日益恶化的情况下,水质监测变得越来越重要,模糊神经网络作为一种新型的。

weixin_50547796的博客 147

创建线程的方式

初识java多线程概述初识多线程线程的两种创建方式多线程会出现的线程不安全问题认识synchronized和volatile关键字java线程抽象内存模型volatile关键字的作用synchronized关键字的作用volatile关键字和synchronized关键字的区别 概述 马老师多线程视频学习总结(好记性不如烂笔头)。 初识多线程 线程的两种创建方式 继承Thread类和实现Runna...

wz122330的博客 338

LPDDR6与LPDDR5 channel/rank/die/bank技术探讨

LPDDR6与LPDDR5 channel/rank/die/bank技术探讨

zilan23的博客 3648

超简单五步实现VOS3000客户端呼入配置

1.查看SIP代理  在注册管理中查看自己线路注册的SIP代理IP地址,记录下来。 2.创建普通账户  创建一个呼入使用的普通账号,选择“计费费率”,根据自己情况选择费率,这里做测试就配置了免费的费率,如果费率不是免费,需要给这个普通账户充值。 3.新建对接网关 新建一个对接网关,点击该网关的“补充设置”,选择“网关类型”为静态IP,然后在IP地址栏填上刚才在注册管理里面记录的SIP代...

非著名运维的博客 1万+

java中的interrupt()方法

interrupt() 方法只是改变中断状态而已,它不会中断一个正在运行的线程。如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常。 1. sleep() &amp;amp;interrupt() 线程A正在使用sleep()暂停着: Thr...

liangxn 9794

包成功安装tiny-cuda-nn,记录安装过程中的问题解决,附带pytorch3d安装【踩坑指南】

该包可以显著提高NeRF训练速度,是和NeRFstudio等框架中,必须使用的。本文提供tiny-cuda-nn可以安装的完整包的下载链接,可以直接上传到项目中安装。附带笔者遇到的问题的解决方案。

zik的博客 7030

初识JAVA多线程(一)

初识JAVA多线程(一)什么是多线程?程序、进程与线程多线程的实例多线程的优点线程的创建与使用三种创建方式及调用方式(1)继承Thread类实现Runnable接口实现Callable接口多线程的实现原理-------------静态代理模式Lamda表达式线程的状态线程的生命周期及状态监测线程的状态改变的常用方法线程休眠---sleep线程礼让---yield线程的插队---join线程的优先级...

weixin_44636607的博客 710

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

初识Java多线程

初识Java多线程进程与线程Java创建多线程ThreadRunnable 进程与线程 进程包含线程 进程是系统分配资源的最小单位,线程是系统调度的最小单位,一个进程内的线程之间可以共享资源 Java创建多线程 Thread Runnable ...

qq_37354060的博客 1042

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java多线程初识

初识多线程 线程是操作系统中CPU运行调度的最小单位,一个进程包含多个线程,每个线程可以执行不同的任务。并发执行可以让程序运行得更快 多线程下的并行、并发 并行 指同一个的时间中,同时执行的线程(两个或以上)。 例如:一台机器需要花10分钟才可以执行完成的任务,两台机器可以拆分任务那么就只需要各5分钟在同一时刻就可以完成,这就代表并行。 注:一个机器可以理解为一个单核的CPU,那么并行就需要多核CPU 并发 多个线程同时请求执行任务,但是在这段时间内就只可以执行一个线程,然而CPU拥有很快的速度,

weixin_43188446的博客 1409

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Java】初识多线程

本文主要详细介绍了多线程的基础知识,包括多线程引入的原因,线程的特性,在Java中如何创建线程,以及对线程的各种操作,通过此,能够更好的了解多线程的基础知识,为后续问题打下基础。

qq_51914226的博客 673

java初识多线程

java初识多线程 文章目录java初识多线程前言1.什么是线程1.1线程的定义1.2线程与进程的区别2.java的多线程2.1java多线程机制2.2主线程3.线程的生命周期与创建3.1线程的生命周期3.2线程的创建3.3目标对象与线程的关系3.3.1目标对象与线程完全解耦3.3.2目标对象组合线程(弱耦合)4.线程常用的方法4.1 start()4.2 run()4.3 sleep()4.4 isAlive()4.5 currentThread()4.6 intrrupt()总结 前言 本文是笔者在

qq_44816011的博客 315

关于java的多线程初识

我们从今天开始,正式学习java的多线程,我们在前面的文章中学习到了java的基础, 但是距离我们工作实战还差的很远,我们学习好了基础,以后的文章会逐步的深入,去讲解各种前端框架,微服务等等😀

落满樱花的羊的博客 557

[Java] 多线程初识

多线程

weixin_65331534的博客 967

初识 Java 多线程

前言 不论是在技术学习的路线上,还是在面试中,多线程与并发出现的频率越来越高。所以不难看出这也是我们需要重点学习的一部分内容,今天的主要内容就是初始Java多线程,掌握线程的几种创建方式,以及多线程中的静态代理。 正文 首先,先理清楚三个概念:程序、进程、线程。 我们平时写的代码叫做程序,当程序运行起来的时候就成为一个进程,进程中有许多线程在执行。 什么是多线程呢?请看下图 上图左边的部分就是我们平常写代码的流程,在主线程(main)中调用run方法,主线程切换出去去执行run()方法,执行完毕后返回,继

A_D_I_D_A_S的博客 285

[从零开始学习JAVA] 初识多线程

本章节我们将开始学习多线程,多线程是一个很重要的知识点,他在我们实际开发中应用广泛并且基础,可以说掌握多线程编写程序是每一个程序员都应当必备的技能,很多小伙伴也会吐槽多线程比较难,但因为其实用性和广泛性,我们一定要学好多线程。

2301_80615512的博客 943

Java 多线程初识

1.什么是线程?与进程有什么区别? 线程是指程序在执行过程中,能够执行程序代码的一个执行单元。在java语言中,线程有4中状态:运行、就绪、挂起和结束。 进程是指一段正在执行的程序。在操作系统级别上,程序的执行都是以进程为单位的,而每个进程中通常都会有多个线程互不影响地并发执行。 1.1 为什么要使用多线程 (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU

u013507760的专栏 270

java多线程学习——初识多线程

线程的概念 线程是计算机系统中能够独立运行的最基本单位,他们基本不拥有系统资源(系统资源能够分配到的最小单位是进程) 多线程的概念 当一个进程拥有一个以上的线程时,即为多线程。 线程的五种状态 线程的状态分为五种,分别是:New(新建) Runnable(就绪)Running(运行) Block(阻塞) Dead(结束)

十年后的你由现在决定 3342
上一篇: 记录前端面试
下一篇: node.js应用场景分析
景洪在编程
博客等级 码龄9年 13粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值