Java复习与学习笔记----进程和线程与同步(上)

简介: Java复习与学习笔记----进程和线程与同步

进程

进程:是正在运行的程序

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

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

线程

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

单线程:一个进程如果只有一条执行路径,称为单线程程序

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

多线程的实现方式

方式一:继承 Thread 类

定义一个类 MyThread 继承 Thread 类

在MyThread 类中重写run()方法

创建MyThread类的对象

启动线程

//**方式一:继承 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( this.getName() + " " + i );
        }
    }
    //重写run方法,run方法是用来封装被线程执行的代码
}
public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();//启动线程
        //调用run方法只是单纯调用方法,没有启动线程
        //调用start方法会导致线程开始执行,Java会调用此线程的run方法
    }
}

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

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

设置和获取线程的名称

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

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

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

public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.setName("我的线程");
        System.out.println(myThread.getName());
    }
}
输出:
我的线程
public class Test {
    public static void main(String[] args) {
        //Thread.currentThread()返回对当前正在执行的线程对象的引用
        System.out.println( Thread.currentThread() );
    }
}
输出:
Thread[main,5,main]

通过构造方法设置线程的名称:

public class MyThread extends Thread {
    public MyThread() {
    }
    public MyThread(String name) {
        super(name);
    }
    @Override
    public void run() {
        for ( int i=0; i<100; i++ ) {
            System.out.println( this.getName() + " " + i );
        }
    }
}
public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread("我的线程");
        System.out.println( myThread.getName() );
    }
}
输出:
我的线程

线程调度

线程有两种调度模式:

分时调度模型:所有线程轮流使用CPU的使用权。平均分配每个线程占用CPU的时间片

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

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

多线程执行具有随机性,因为谁抢到CPU的使用权不一定

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

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

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

线程的优先级具有范围:1-10,默认优先级为5

public class Test {
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread();
        System.out.println(myThread1.getPriority());
        MyThread myThread2 = new MyThread();
        myThread2.setPriority(10);
        MyThread myThread3 = new MyThread();
        myThread3.setPriority(1);
        System.out.println(myThread2.getPriority());
        System.out.println(myThread3.getPriority());
    }
}
输出:
5
10
1
System.out.println(Thread.MAX_PRIORITY);
System.out.println(Thread.MIN_PRIORITY);
输出:
10
1

线程优先级高仅仅表示获取CPU时间片的几率高,并不是优先级高的线程一定每次都可以抢到CPU时间片

线程控制

sleep
public class MyThread extends Thread {
    public MyThread() {
    }
    public MyThread(String name) {
        super(name);
    }
    @Override
    public void run() {
        for ( int i=0; i<100; i++ ) {
            System.out.println( this.getName() + " " + i );
            try {
                Thread.sleep(1000);//线程休眠一秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
join
public class Test {
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        MyThread myThread3 = new MyThread();
        myThread1.start();
        try {
            myThread1.join();//线程一执行完成才会执行后面其他线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        myThread2.start();
        myThread3.start();
    }
}
setDaemon
public class Test extends Thread {
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        myThread1.setDaemon(true);
        myThread2.setDaemon(true);
        myThread1.start();
        myThread2.start();
        Test test = new Test();
        test.start();
        //当test执行结束,剩下的线程都为守护线程,会直接退出
    }
    @Override
    public void run() {
        for ( int i=0; i<10; i++ ) {
            System.out.println( "main" + " " + i );
        }
    }
}
public class MyThread extends Thread {
    @Override
    public void run() {
        for ( int i=0; i<100; i++ ) {
            System.out.println( this.getName() + " " + i );
        }
    }
}

线程的生命周期

多线程的实现方式二

创建线程的另一种方法:声明一个实现Runnable接口的类,实现run方法。然后可以分配类的实例,在创建Thread时作为参数传递,并启动线程。

实现多线程的方法二:

1.定义一个MyRunnable类实现Runnable接口

2.在MyRunnable类中重写run方法

3.创建MyRunnable类的对象

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

5.启动线程

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for ( int i=0; i<10; i++ ) {
            System.out.println( i );
        }
    }
}
public class Test {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

给线程设置名字

thread.setName("我的线程");
System.out.println(thread.getName());

在创建线程对象时,给线程设置名字

Thread thread = new Thread(myRunnable, "我的线程~~");
        System.out.println(thread.getName());

多线程的实现方案:

1.继承Thread类

2.实现Runnable接口

相对于继承Thread类,实现Runnable接口,避免了Java单继承的局限性,适合多个相同程序的代码处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想


相关文章
|
9月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
1225 2
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
434 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
401 1
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
483 0
|
调度 开发工具 Android开发
【HarmonyOS Next】鸿蒙应用进程和线程详解
进程的定义: 进程是系统进行资源分配的基本单位,是操作系统结构的基础。 在鸿蒙系统中,一个应用下会有三类进程:
480 0
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
488 67
|
SQL 监控 网络协议
YashanDB进程线程体系
YashanDB进程线程体系
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
828 0
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
567 6