java线程小结

news/2024/11/25 22:24:06/

线程

1.概念与原理

1.1线程和进程的概念

现在的操作系统是多任务操作系统,而多线程是实现多任务的一种方式

进程:是指内存中运行的应用程序,有自己独立的内存空间,可以独立的运行,进程彼此之间互不干扰,一个进程可以包含多个线程

线程:是进程中的一个执行流程,一个进程包含多个线程,线程与线程之间共享该进程的资源

进程和线程都是实现多任务的技术,但是进程是资源分配的基本单位,线程是程序执行的基本单位

1.2 java中的线程

在Java中 使用java.lang.Thread类或者Java.lang.Runnable接口编写代码来定义、实例化和启动一个新线程。

一个Thread类实例只是一个对象,和其它对象一样,具有变量和方法,生死于堆上。

2. 线程的创建与启动

2.1 继承Threat类

//使用一个类继承Threat类,然后重写run方法
//多线程抢占式运行
class MyThread extends Thread{@Overridepublic void run() {for (int i=0;i<100;i++)System.out.println("线程1:"+i);}
}
class MyThread1 extends Thread{private String threadName;@Overridepublic void run() {for (int i=0;i<100;i++)System.out.println("线程2:"+i);}
}public class A_Thread {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();MyThread1 myThread1 = new MyThread1();myThread1.start();for (int i=0;i<100;i++)System.out.println("主线程:"+i);}
}

2.2 实现Runnable接口

class Methread implements Runnable{@Overridepublic void run() {for (int i=0;i<100;i++)System.out.println("线程1:"+i);}
}
class Methread1 implements Runnable{@Overridepublic void run() {for (int i=0;i<100;i++)System.out.println("线程2:"+i);}
}
public class B_Runnable {public static void main(String[] args) {Methread mt = new Methread();Thread thread = new Thread(mt);thread.start();Thread thread1 = new Thread(new Methread1());thread1.start();for (int i=0;i<100;i++)System.out.println("主线程:"+i);}
}

2.3 线程的方法

构造方法:

Thread创建新的Thread对象
Thread(Runnable target)传入一个实现Runnable接口的实例作为参数,创建Thread对象
Thread(Runnable target,String name)创建Thread对象并起名字

线程下面的方法

intgetPriority();返回线程优先级
voidsetPriority(int newPriority);更改线程优先级
class MyThread1 implements Runnable{@Overridepublic void run() {for (int i=0;i<=100;i++)System.out.println(Thread.currentThread().getName()+":"+i);}
}
class Mythread2 implements  Runnable{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName()+":"+i);}}
}public class A_Priority {public static void main(String[] args) {Thread thread1 = new Thread(new MyThread1(), "线程一");Thread thread2 = new Thread(new Mythread2(), "二号");thread1.setPriority(7);//虽然thread1的优先级比较高,但执行的时候还是抢占式,并不会因为优先级高就先执行//结果不可预期thread1.start();thread2.start();}
}
/*二号:41
二号:42
线程一:87
二号:43
二号:44
二号:45
线程一:88
线程一:89*/

3.线程同步和锁

为什么要线程同步:当多个线程同时请求一个数据的时候,可能会导致数据不准确的情况

class SaleTicket implements Runnable{@Overridepublic void run() {int count=100;while(true){if (count<0)break;System.out.println(Thread.currentThread().getName()+"剩余票数:"+count);count--;}}
}public class A_NotTongBu {public static void main(String[] args) {SaleTicket saleTicket = new SaleTicket();new Thread(saleTicket, "线程1").start();new Thread(saleTicket, "线程2").start();}
}
/*线程2剩余票数:36
线程2剩余票数:35
线程1剩余票数:98
线程1剩余票数:97
线程1剩余票数:96
线程1剩余票数:95
线程2剩余票数:34
线程2剩余票数:33
*/

对于这种情况我们可以在方法声明的时候加上一锁,可以使用synchronized关键字,也可以加在循环的时候,这样就可以防止多个线程在访问同一个资源的时候,避免出现线程不安全的情况。

4.死锁

死锁是线程的一种状态,当两个对象需要访问彼此所持有的资源,但是又不肯释放自身所持有的资源时,两个线程僵持住,就是死锁。

5.Object类下面与线程有关的方法

void wait()让当前线程等待,直到另一个线程调用当前对象的notify
void notify()唤醒线程池中等待的线程
void notifyAll()唤醒所有等待中的所有线程

6.线程的生命周期

线程的创建与启动 start

可以运行的状态 抢占 等待

执行状态 抢占 执行

阻塞 wait sleep 锁

消亡 destroy

7.生产者消费者模式

生产者,消费者,商品三者要遵循一定的规律,

当有商品时消费者可以消费,

当没有商品时消费者不能消费,生产者需要生产,

当商品栏满的时候生产者停止生产,消费者可以消费

class Goods{private String name;private String id;private boolean isProduct;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public boolean isProduct() {return isProduct;}public void setProduct(boolean product) {isProduct = product;}public Goods(String name, String id, boolean isProduct) {this.name = name;this.id = id;this.isProduct = isProduct;}
}class Customer implements Runnable{private Goods goods;public Customer(Goods goods) {this.goods = goods;}@Overridepublic void run() {while(true){synchronized (goods){if (!goods.isProduct()){//不需要生产System.out.println("消费者购买了:"+goods.getName()+",价格为:"+goods.getId());goods.setProduct(true);goods.notify();}else{try {goods.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}class Productor implements Runnable{private Goods goods;public Productor(Goods goods) {this.goods = goods;}@Overridepublic void run() {int count=0;int num=0;while (num<100){num++;synchronized (goods){if (goods.isProduct()){if (count%2==0){goods.setName("比亚迪元");goods.setId("10");goods.setProduct(false);count++;System.out.println("制造了第"+num+"辆:"+goods.getName()+",价格为:"+goods.getId());}else{goods.setName("比亚迪唐");goods.setId("30");goods.setProduct(false);count++;System.out.println("制造了第"+num+"辆:"+goods.getName()+",价格为:"+goods.getId());}goods.notify();}else{try {goods.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}public class Test1 {public static void main(String[] args) {Goods goods = new Goods("MINI", "4.4", true);Customer customer = new Customer(goods);Productor productor = new Productor(goods);new Thread(customer).start();new Thread(productor).start();}
}

http://www.ppmy.cn/news/47003.html

相关文章

【C++】从C语言入门C++的基础知识

C基础知识 前言1. C关键字2. 命名空间namespace命名空间的创建命名空间的使用命名空间的注意事项 3. C输入&输出4. 缺省参数概念分类全缺省参数半缺省参数 5. 函数重载概念实现C为什么能进行函数重载C和C的相互调用&#xff08;可以不用看&#xff09; 6. 引用概念注意事项…

【云原生进阶之容器】第六章容器网络6.4.3--Flannel网络模式

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

系统接口幂等性设计探究

前言&#xff1a; 刚开始工作的时候写了一个带UI页面的工具&#xff0c;需要设计登录功能&#xff0c;登录功能也很简单&#xff0c;输入用户名密码点击登录&#xff0c;触发后台查询并比对密码&#xff0c;如果登录成功则返回消息给前端&#xff0c;前端把消息弹出提示一下。…

面向计算机视觉的深度学习:1~5

原文&#xff1a;Deep Learning for Computer Vision 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如何实…

MVC和MVVM模式的区别

MVVM 和 MVC 都是软件架构模式&#xff0c;其中 MVVM 表示“Model-View-ViewModel”&#xff0c;而 MVC 表示“Model-View-Controller”。 MVC 模式中&#xff0c;控制器&#xff08;Controller&#xff09;充当视图&#xff08;View&#xff09;和模型&#xff08;Model&…

C语言中如何判断大小端字节序?

大小端&#xff08;Endian&#xff09;是指多字节整数在内存中存储的方式。在计算机中&#xff0c;一个多字节整数由多个字节组成&#xff0c;而不同的机器和处理器在存储多字节整数时会有两种不同存储方式&#xff0c;分别为大端字节序和小端字节序。 以一个4字节整数0x12345…

RHCE第二次作业

一、配置nto时间服务器&#xff0c;确保客户端主机和服务器主机同步时间 1、NTP是网络时间同步协议&#xff0c;就是用来同步网络中各个计算机的时间的协议。 2、NTP服务端配置 &#xff08;1&#xff09;检查系统是否安装了NTP包&#xff08;Linux一般自带NTP4.2&#xff09;&…

图染色问题的NP完全性证明

文章目录 1.Overview2.CNF 3-sat3. Gadgets3.1 Concolorous Edges3.2 Starter/Variable Gadget3.3 Splitter Gadget3.4 OR Gadget3.5 Clause Gadget 4. To Planar Graph 最近在学 6.890&#xff0c;然后 devans 刚好问了我这个问题&#xff0c;然后尝试编了一个证明。 1.Overv…