多线程编程(进程和线程)

多线程编程(进程和线程)

1.进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程可以启动多个线程。

2.线程:指程序中一个执行流程,一个进程中可以运行多个线程。

一、创建线程(两种方式)

二、线程的5种状态( New,Runnable,Running,Block,Dead ):

三、线程的优先级

四、守护线程 /精灵线程/后台线程

五、方法

六、同步代码锁(synchronized)

一、创建线程(两种方式):

方式1:采用继承Thread的方法

第一,继承 Thread 类

第二,覆盖 run 方法(就是更新运行过程), 实现用户自己的过程

第三,创建线程实例(就是创建一个线程)

第四,使用线程实例的 start() 方法启劢线程, 启劢以后线程会尽快的去并发执行 run()

public class Mythread extends Thread {
@Override
public void run() {
    for (int i = 0; i <100; i++) {
        System.out.println("hello"+i);
        yield();
    }
}
}

 Mythread my1=new  Mythread();
 my1.start();

方式2:采用实现Runnable的方法

public class MyThread2 implements Runnable {
int tickets = 10;
@Override
public void run() {

        for (int i = 0; i <10; i++) {
            if (this.tickets > 0){
            System.out.println(Thread.currentThread().getName() + "出售车票"
                    + tickets--);
            }
        }
}
}

二、线程的5种状态( New,Runnable,Running,Block,Dead ):

1. New 新建状态:

new 关键字创建了一个线程后,该线程就处于新建状态,调用 start()方法时,线程启劢,迚入 Runnable 状态

2. Runnable 可运行(就绪)状态:

Runnable 状态时,表示线程准备就绪,等待获取 CPU

3.Running 运行(正在运行)状态:

线程获取了 CPU,则迚入 Running 状态

4.Block 阻塞(挂起)状态

线程调用了 sleep()方法,线程调用了一个阻塞式 IO 方法时被阻塞,当阻塞结束时,该线程将迚入 Runnable 状态

5.Dead 死亡状态

当线程的 run()方法执行结束,线程迚入 Dead 状态

三、线程的优先级

(资源紧张时候, 尽可能优先)setPriority()最高级别为10,最低级别为1,默认级别为5

     Mythread my1=new  Mythread();
     Mythread2 my2=new  Mythread2();
     my1.setPriority(10);//设置线程的优先级(资源紧张时候,尽可能优先)
     my2.setPriority(1);
    将my1的优先级设为10,my2的优先级设为1,多的代表优先被执行

四、守护线程 /精灵线程/后台线程

setDaemon();只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Java 过程的结束:当前所有前台线程都结束时, Java 过程结束,当前台线程结束时,不管后台线程是否结束, 都要被停掉!

    Thread2 t2=new Thread2();
    t2.setDaemon(true);

五、方法

5.1:join();

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。 join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。

     Mythread my1=new  Mythread();
     Mythread2 my2=new  Mythread2();
     my1.start();
     my1.join();//先执行完my1,再执行下面的
     my2.start();

5.2:sleep(long millis) ;

在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

    public void run() {
    for (int i = 0; i < 30; i++) {
        synchronized (this) {// 同步代码块
            if (tickets > 0) {
                System.out.println(Thread.currentThread().getName()
                        + "出售车票" + tickets--);
            }
        }
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}

5.3:yield();

暂停当前正在执行的线程对象,并执行其他线程。 一般写在重写方法里面

@Override
public void run() {
    for (int i = 0; i <100; i++) {
        System.out.println("yes"+i);
        yield();
    }
}

5.4:setName();

改变线程名称,使之与参数 name 相同。

Thread1 t1=new Thread1();
    t1.setName("主线程");

六、同步代码锁(synchronized)

1、异步:并发, 各干自己的。

2、同步:步调一致的处理。

多个线程并发读写同一个临界资源时候会发生”线程并发安全问题。

常见的临界资源:

1、多线程共享实例变量

2、静态公共变量

6、1 同步方法:要使用临界资源的位置加锁

int tickets=20;
public void run() {
    for (int i = 0; i <20; i++) {
        sale();
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
public synchronized void sale(){//创建方法,加synchronized关键字
    if(tickets>10){
            System.out.println(Thread.currentThread().getName()+"出售车票"+tickets--);
        }
}

6、2 同步代码块的方式:synchronized();

int tickets = 20;
@Override
public void run() {
    for (int i = 0; i < 30; i++) {
        synchronized (this) {// 同步代码块
            if (tickets > 0) {
                System.out.println(Thread.currentThread().getName()
                        + "出售车票" + tickets--);
            }
        }
        try {
            Thread.sleep(10);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

}
时间: 2024-10-13 23:55:44

多线程编程(进程和线程)的相关文章

Java多线程之 -- 进程和线程

Java多线程之 – 进程和线程 概念 进程 程序的动态执行过程 包括占用的资源(内存.CPU)和线程 线程 线程是程序中最小的执行单位 一个进程有多个线程 线程共享进程的资源 进程和线程的区分 我们可以想象为进程为班级而线程是邦奇中得每一个学生 线程之间的交互 互斥,类似于每一个学生都为了第一名而你争我让,线程也是,都想抢占CPU的资源 同步,当举行运动会的时候,大家都团结一心,彼此共享自己的资源 Thread.Runnable Thread Introduction Thread 是Java

C# - 多线程 之 进程与线程

转自原文 C# - 多线程 之 进程与线程 目录 并行~并发 进程~多进程 线程~多线程 线程池 线程同步 线程安全 回到顶部 并行~并发 并发 Concurrency,逻辑上的同时发生,一个处理器(在不同时刻或者说在同一时间间隔内)"同时"处理多个任务.宏观上是并发的,微观上是按排队等待.唤醒.执行的步骤序列执行.并发性是对有限物理资源强制行使多用户共享(多路复用)以提高效率. 并行 Parallelism,物理上的同时发生,多核处理器或多个处理器(在同一时刻)同时处理多个任务.并行

Java多线程编程基础之线程对象

在进入java平台的线程对象之前,基于基础篇(一)的一些问题,我先插入两个基本概念. [线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent).而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel). 在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储

多线程编程学习笔记——线程池(一)

接上文 多线程编程学习笔记——线程同步(一) 接上文 多线程编程学习笔记——线程同步(二) 接上文 多线程编程学习笔记——线程同步(三) 创建多线程操作是非常昂贵的,所以每个运行时间非常短的操作,创建多线程进行操作,可能并不能提高效率,反而降低了效率. 如果你有非常多的执行时间非常短的操作,那么适合作用线程池来提高效率,而不是自行创建多线程. 线程池,就是我们先分配一些资源到池子里,当我们需要使用时,则从池子中获取,用完了,再放回池子里. .NET中的线程池是受CLR管理的,TheadTool类

多线程编程学习笔记——线程同步(三)

接上文 多线程编程学习笔记——线程同步(一) 接上文 多线程编程学习笔记——线程同步(二) 七.使用Barrier类 Barrier类用于组织多个线程及时在某个时刻会面,其提供一个回调函数,每次线程调用了SignalAndWait方法后该回调函数就会被执行. 1.代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //

多线程编程--进程&amp;&amp;线程

看完上篇博文的介绍后,大家应该大概了解进程和线程的由来.有了这样一个背景我们进一步来看一下线程和进程. 引入进程: 进程可以提高系统的并发性,提高CPU的使用率,从而提高程序的性能.在以前单道操作系统中,一次只执行一个程序,这样执行效率很低,资源得不到充分的利用.所以后来多道操作系统出现了,由于多道操作系统一次并发执行很多程序,但管理起来非常麻烦.因此进程的概念就被提出来了,它是一个程序动态执行表现,而且进程中包含了程序的资源,并管理程序如何去使用资源.可以说进程是程序的一种动态表现形式. 引入

VC++深入详解——第15章:多线程,进程,线程

1. 进程: (1)程序与进程 程序是计算机指令的集合,文件形式存储在计算机磁盘上. 进程是程序执行的一个实例,是一个程序在其地址空间的一次执行活动. 一个程序可以对应着多个进程. 进程是资源申请,调度看,独立运行的单位. (2)进程的组成: 内核对象:系统用来存放进程的相关统计信息的地方,是操作系统内部分配的一个内存块. 地址空间:包含所有可执行模块或DLL模块的代码和数据,还包含动态分配的内存空间,线程的栈和堆分配的空间. (3)进程不执行任何程序,进程只是线程的容器,是线程执行程序的环境.

(并发编程)进程池线程池--提交任务的2种方式、协程--yield greenlet,gevent模块

一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用"池":池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务属于计算密集型池子内什么时候装线程:并发的任务属于IO密集型 #提交任务的两种方式:    # 同步调用:提交完一个任务之后,就在原地等待,等待任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行的    # 异步调用:提交完一个任务之后,不在原地等待,结果???,而是

并发编程 --- 进程,线程

目录 进程 线程 进程 1.进程互斥锁 异步可以让多个任务在几个进程中并发处理,他们之间没有运行顺序,一旦开启也不受我们的控制,尽管并发编程让我们更加充分的利用IO资源,但是当多个进程使用同一份资源的时候,就会引发数据安全或顺序混乱的问题 import json import time from multiprocessing import Process from multiprocessing import Lock # 查看余票 def search(user): # 打开data文件查看