关于java线程的一些了解

进程:就是正在运行的程序,分配内存让应用程序能够运行

Windows系统号称多任务(可以同时运行多个应用程序)

宏观上看:windows确实是允许多个程序

微观上看:CPU快速切换执行任务,由于速度特别快,我们人感觉不到这个切换的过程

线程:线程在一个进程中负责代码的执行,就是一个进程中的执行路径

疑问:没有学习线程,为什么代码可以执行

Java程序在运行的时候,jvm会帮我们创建一个主线程来执行代码。主线程主要负责main方法中的代码执行

一个java程序中至少有2个线程:

一个是主线程主要负责main方法中的代码执行,一个垃圾回收站线程,负责垃圾回收

多线程:在一个进程中多个线程同时执行不同的任务。“同时”:单核CPU快速切换多线程执行任务,速度特别快,感觉不到切换

多线程的好处:

1.解决一个进程中同时执行多个任务的问题

2.提高资源的利用率

多线程的弊端:

1.增加CPU的负担,不是线程越多越好

2.降低了一个进程中线程的执行概率

3.线程容易引发线程安全问题

4.容易出现死锁现象

Java中创建线程的两种方式:
 方式一:Thread(线程类)

1.需要定义一个类来继承Thread类

2.重写thread类中的run方法,把自定义线程的任务代码写在run方法中

每一个线程都会有自己的任务代码,jvm创建的主线程的任务代码就是main方法,自定义的线程的任务代码就写在run方法中

3.创建Thread的子类,并且调用start方法开启线程

注意点:一旦线程开启了,会默认执行线程对象中的run方法,但是千万不要自己直接调用run方法,如果直接调用run方法就和普通方法没什么区别

线程的生命周期:

创建:新创建了一个线程对象。

可运行:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取cpu的执行权。

运行:就绪状态的线程获取了CPU执行权,执行程序代码。

阻临时塞: 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

死亡:线程执行完它的任务时。

线程中常用的方法:

Thread(String name)  初始线程的名字

getNema()            返回线程的名字

setNema(String name) 设置线程对象名

Sleep()              线程睡眠的指定毫秒数

getPriority()返回当前对象的优先级  默认线程的优先级是5

setPriority(int newPriority) 设置线程的优先级 虽然设置可优先级,但是具体的实现取决于底层的操作系统的实现 (优先级最大的是 10,最小的是1,默认的是5)

currentThread()       返回CUP正在执行的线程的对象

对于线程不安全的解决方法:
  java给线程加锁:

方式一:同步代码块

锁对象可以是任意一个java中的对象(任意类型的对象)

Java中的任意一个对象都会有一个对象的状态,就可以通过对象的状态作为锁的一个标识符

列如:  statue = 0 表示锁关闭  statue=1表示打开

Synchronized(锁对象){   }

同步代码块的使用注意点:

1.任意一个对象都可以做锁对象

2.如果你在同步代码块中调用了sleep方法,不会释放锁对象

3.只有正真的存在线程安全的时候才需要使用同步代码块,

否则会降低执行效率

4.多线程操作锁对象必须是唯一,否则无效

不知道线程什么时候安全什么时候不安全?

出现线程安全的问题根本原因:

1.存在两个或者两个以上的线程,并且线程之间共享着一个资源

2.多个语句操作共享资源

方式二:同步函数:用关键字synchronized 修饰函数

同步函数是有锁对象的
  同步函数的使用是一个静态函数注意点:

1.如是一个非静态的函数,同步函数的锁就是调用方法的对象(this对象),如果是一个静态同步函数的锁对象是当前函数所属类的字节码文件(class对象)

2.同步函数的锁对象是固定的,不能够自己指定

3.同步函数是同步整个函数的代码

同步代码块和同步函数中,优先使用同步代码块

原因:

1.同步代码块的锁对象可以由我任意指定,同步函数是固定的

2.同步代码块可以控制被同步范围,同步函数必须是整个函数的所有代码都被同步

线程死锁现象问题:

线程死锁不一定会出现,有可能会出现

死锁现象的解决方法:没有方案,尽量避免

线程的定义方式二:

1.自定义一个实现Runable接口,接口中会提供一个run方法

2.实现Runable接口中的run方法,将线程中的任务写在run方法中

3.创建Runable接口的实现对象

4.创建一个Thread对象,并且把Runable实现类创建的对象作为参数

5.调用Tread对象的star方法来开启线程

问题:为什么要将Runable接口实现类的对象作为参数传递?

为了让对象中的run方法能够在线程中的run方法中执行,也就是能够将这个对象中的run方法作为线程中的任务来执行

方法Thread和Runable 推荐使用Runable

Java是单继承,就不能够继承Thread对象来实现多线程

线程的通讯:一个线程完成自己的任务,去通知另外一个线程去完成另一个任务

wait();  等待 如果线程执行了wait方法,那么该线程就会处于一个等待状态,等待状态的线程必须要通过其他线程来调用notify()方法来唤醒

notify(); 唤醒  随机唤醒线程池中的一个线程

notifyAll();唤醒所有的线程

wait和notify的使用注意点:

1.wait方法和notify方法是属于Object对象

2.wait方法和notify方法必须在同步线程中执行

3.wait方法和notify方法必须有锁对象来调用

时间: 2024-12-26 06:54:11

关于java线程的一些了解的相关文章

java 线程详解

5月7号  周末看了一下线程方面的内容 ,边看视频边看书还附带着参考了很多人的博客,一天的收获,写下来整理一下:感觉收获还是挺多的:过段时间可能看完java  这几大块要去看一下关于spring boot  的内容顺便  也整理一下:附上我参考的 几本书: 关于java  线程,首先要了解一下线程和进程之间的关系.区别以及他们之间的概念: 首先是线程: 什么是线程? 线程是在程序执行过程中能够执行部分代码的一个执行单元,也看看做是一个轻量级的进程:线程是程序内的程序控制流只能使用程序内分配给程序

Java线程工作内存与主内存变量交换过程及volatile关键字理解

Java线程工作内存与主内存变量交换过程及volatile关键字理解 1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行.此处的所谓内存模型要区别于通常所说的虚拟机堆模型: 2. 线程独有的工作内存和进程内存(主内存)之间通过8中原子操作来实现,如下图所示: 原子操作的规则(部分): 1) read,load必须连续执行,但是不保证原子性. 2) store,write必须连续执行,但是不保证原子性. 3) 不能丢失变量最后一次ass

java线程

Java线程详解 1.操作系统中的线程和进程讲解: 现在的操作系统大都是多任务操作系统,多线程是多任务的一种. 进程是指操作系统中运行的一个程序,每个进程都有自己的一块内存空间,一个进程中可以启动多个线程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. Java线程的两种具体实现方法: 第一种继承:具体代码实现如下: Public (

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

Java线程使用大全

1.线程实现 1.Thread类 构造方法: 案例代码: public class Ex10_1_CaseThread extends Thread {// 创建一个类继承(extend)Thread类 String studentName; public Ex10_1_CaseThread(String studentName) {// 定义类的构造函数,传递参数 System.out.println(studentName + "申请访问服务器"); this.studentNam

java线程五种状态

java线程五种状态: 创建 -> 就绪 -> 运行 -> 销毁 创建 -> 就绪 -> 运行 -> 等待(缺少资源) -> 销毁 下图:各种状态转换

java线程详细介绍

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1

java 线程通信

java 线程通信使用wait notify 配合synchronized 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态.当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁. 如下代码: public class ThreadTest { //声明一个线程可视化的list集合 public static List<String> lis

分享一个java线程专栏

专栏 : java线程基础 转载自 http://blog.csdn.net/column/details/yinwenjiethread.html 专栏内容: 1.线程基础:线程(1)--操作系统和线程原理 2.线程基础:线程(2)--JAVA中的基本线程操作(上) 3. 线程基础:线程(3)--JAVA中的基本线程操作(中) 4.线程基础:线程(4)--JAVA中的基本线程操作(下) 5.线程基础:线程池(5)--基本使用(上) 6.线程基础:线程池(6)--基本使用(中) 7.线程基础:线

Java线程经典面试题

53道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并