进程和线程 java_Java学习笔记:进程和线程

我会带着你远行 2022-11-06 00:55 193阅读 0赞

进程

进程:是正在运行的程序

是系统进行资源分配和调用的独立单位

每一个进程都有它自己的内存空间和系统资源

线程

线程:是进程中的单个顺序控制流,是一条执行路径

单线程:一个进程如果只有一条执行路径,则成为单线程程序 eg:记事本程序

多线程:一个进程如果有多条执行路径,则称为多线程程序 eg:扫雷程序

多线程的实现方式

方式1:继承Thread类

定义一个类MyThread继承Thread类

在MyThread类中重写run()方法

创建MyThread类的对象

启动线程

public class MyThread extends Thread{

@Override

public void run() {

for(int i=0;i<100;i++){

System.out.println(i);

}

}

}

public class MyThreadDemo {

public static void main(String[] args) {

MyThread my1=new MyThread();

MyThread my2=new MyThread();

//void start()导致此线程开始执行,java虚拟机调用此线程的run方法

my1.start();

my2.start();

}

}

重写run()方法:run()是用来封装被线程执行的代码

run()和start()方法区别

run():封装线程执行的代码,直接调用,相当于普通方法的调用

start():启动线程,然后由JVM调用此线程的run()方法

方式2:实现Runnable接口

定义一个类MyRunnable实现Runnable接口

再MyRunnable类中重写run()方法

创建MyRunnable类的对象

创建Thread类的对象,把MyRunnable对象作为构造方法的参数

启动线程

public class MyRunnable implements Runnable{

@Override

public void run() {

for(int i=0;i<100;i++){

System.out.println(Thread.currentThread().getName()+”:”+i);

//并没有直接继承Thread类,所以不能直接getName,要先获取currentThread

}

}

}

public class MyRunnableDemo {

public static void main(String[] args) {

//MyRunnable可以看作是1个资源,由多个线程同时使用

MyRunnable my=new MyRunnable();

Thread t1=new Thread(my);

Thread t2=new Thread(my);

//Thread(Runnable target,String name)实现线程对象的同时,赋予名字

Thread t3=new Thread(my,”Jack”);

Thread t4=new Thread(my,”Tom”);

t1.start();

t2.start();

}

}

相比继承Thread类,实现Runnable接口的好处

避免了Java单继承的局限性

适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想

设置和获取线程的名称

Thread类中设置和获取线程名称的方法

void setName(String name):将此线程的名称更改为等于参数name

String getName():返回此线程的名称

static Thread currentThread()返回对当前正在执行的线程对象引用

设置获取方式1

public class MyThread extends Thread{

@Override

public void run() {……}

}

}

public class MyThreadDemo {

public static void main(String[] args) {

MyThread my=new MyThread();

my.setName(“Tom”);

my.start();

}

}

设置获取方式2

public class MyThread extends Thread{

public MyThread(){}//重写构造方法后可以在初始化时就命名

public MyThread(String name){

super(name);

}

@Override

public void run() {……}

}

}

public class MyThreadDemo {

public static void main(String[] args) {

MyThread my=new MyThread(“Tom”);

my.start();

}

}

获取设置方式3

Thread.currentThread().getName();//返回当前正在执行线程对象名

线程调度

Java使用的是抢占式调度模型

抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一点

多线程程序的执行是有随机性的,而谁抢到CPU的使用权是不一定的

Thread类中设置和获取线程优先级的方法

public final int getPriority():返回此线程的优先级

eg:tp.getPriority()

public final void setPriority(int newPriority):更改此线程的优先级

eg:tp.setPriority(10)

线程优先级范围1~10,一般是5;线程优先级高仅仅表示获取CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才会有明显效果

线程控制

static void sleep(long millis)使当前正在执行的线程停留(暂停执行)指定的毫秒数

ThreadSleep类中写方法

public void run(){

for(int i=0;i<100;i++){

System.out.println(getName()+”:”+i);//出现异常用trycatch抛出

Thread.sleep(1000);//每隔1秒线程输出一次

}

}

void join()等待这个线程死亡

tj.join();//当这个线程执行完毕后,其他线程再开始执行

void setDaemon(boolean on)将此线程标记为守护线程,当运行线程都为守护线程时,Java虚拟机将退出

td.setDaemon();//当主线程结束的时候,守护线程也要随之结束,但不是立即生效

线程生命周期

b62ce79dee24

2021-02-04_155822.jpg

线程同步

详见线程案例

线程安全的类

StringBuffer

线性安全,可变字符序列

从JDK5开始,被StringBuilder替代,但StringBuilder无法做到线程安全

Vector

从Java2平台开始,该类改进了List接口,使其成为Java Collections Framework的成员。Vector被同步,如果不需要线程安全实现,建议使用ArrayList替代Vector

Hashtable

该类实现了一个哈希表,它将键映射到值,任何非null对象都可以作为键或值

从Java2平台开始,该类改进实现了Map接口,使其成为Java Collections Framework的成员。Vector被同步,如果不需要线程安全实现,建议使用HashMap替代Hashtable

Vector和HashTable在多线程中也被弃用,

而是用Collections调用方法包装List,Set和Map集合,使其线性安全

eg:List list = Collections.synchronizedList(new ArrayList())

Lock锁

Lock可以更清晰表达如何加锁,如何释放锁

void lock()获取锁

void unlock()释放锁

ReentrantLock()Lock是接口不能直接实例化,采用它的实现类来实例化

private Lock lock=new ReentrantLock();

try{

lock.lock()

if(…){……}

}finally{

lock.unlock();

}

//使用tryfinally的结果即使操作代码出了问题,最后也会去释放锁

发表评论

表情:
评论列表 (有 0 条评论,193人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线进程

    目录 进程 线程 实现多线程的方法 方式一:继承Thread类 设置和获取线程名称 线程调度 线程控制 线程的状态(生命周期) 方式二:实现Runnab

    相关 线进程

    目录 一、线程和进程的区别 二、线程 三、分时操作系统 四、如何减少上下文切换 五、多线程和单线程 六、多线程的使用场景 --------------------

    相关 线进程

    线程和进程 一、线程和进程 线程是CPU调度和分派的基本单位。 进程对于操作系统来说就是一个任务。 听起来挺难懂的一句话,我们举一个实际例子:比如现在有一条需要

    相关 进程线

    1.概念 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位

    相关 进程线

    进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内调度实体。比进程更小的独立运行

    相关 进程线

    进程和线程 开发工具与关键技术:java 撰写时间:2019/5/15 进程和线程 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间

    相关 进程线

    进程和线程 概念 进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、 数据栈以及其他用于跟踪进程执行的

    相关 线进程

    1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它