JAVA基础9(多线程)

1:多线程

(1)线程是依赖于进程而存在的。

A.进程正在运行的应用程序

B.线程进程的执行路径,执行单元

(2)多线程的两种方案:

继承Thread类:

实现Runable接口:

public class MyThread implements Runnable{

//实现runnable接口

public void run() {

//启动该线程对象之后,需要执行的代码

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

System.out.println(i);

}

}

}

public class MyThread extends Thread{

//1.继承Thread类

//2.重写run方法

public void run() {

//开启该线程之后,执行一个for循环

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

System.out.println(i);

}

}

}

(3)多线程的几个问题:

A.启动线程的方法

start()

B.start()和run()的区别

start():1.开启线程  2.执行run()方法里面的代码

run():执行的是线程里面执行的代码,并不会开启线程

C.重写run()

因为每个线程需要执行的代码都是都是不一样的,

我们需要将每个线程自己独立执行的代码写到run()方法中执行

D.线程不可以多次启动

(4)线程的调度和控制

线程休眠(Thread.sleep(毫秒值))

线程名称(setName(),getName();)

线程的调度及优先级setPriority(10)(注意默认值是5,区间在1-10之间)

线程优先级:设置抢占cpu执行权抢占到的概率

(5)多线程案例(两种方式实现,睡一会出现线程安全问题):

继承Thread卖票

实现Runnable卖票(睡一会出现线程安全问题)

按照真实的情景加入了延迟,出现了两个问题:

A.相同的票卖了多次

CPU的一次操作必须是原子性的(操作是CPU执行一次就可以直接完成的)

B.出现了负数的票

随机性和延迟导致的

出现上面的问题称为线程安全问题。

public class MyThread extends Thread{

//共有100张票,将ticket改为静态之后,被类的所有对象所共享

static int ticket = 100;

public void run() {

//用一个while true循环模拟三个窗口一直处于打开的状态

while (true) {

//只有当ticket>0的时候,才可以出售票

if (ticket>0) {

System.out.println(getName()+"正在出售第:"+ticket--+"张票");

}

}

}

}

public class Test {

public static void main(String[] args) {

//创建三个线程模拟三个售票窗口

MyThread mt1 = new MyThread();

MyThread mt2 = new MyThread();

MyThread mt3 = new MyThread();

//给线程设置名称

mt1.setName("窗口一");

mt2.setName("窗口二");

mt3.setName("窗口三");

//启动线程,开启售票

mt1.start();

mt2.start();

mt3.start();

}

}

(6)多线程安全问题

A.是否是多线程环境

B.是否有共享数据

C.是否有多条语句操作共享数据

(7)如何解决多线程安全问题

线程安全执行效率就低

A.同步代码块(测试不是同一个锁的情况,测试是同一个锁的情况)

synchronized(对象) {

需要被同步的代码。

}

B.两个问题:1.对象是什么 ?

答:任意对象 ,相当于是一把锁,只要线程进去就把锁锁上

2.需要同步的代码?

答:被线程执行的代码

C.锁对象问题

a.同步代码块(定义一个抽象类,里面专门定义一个锁)

任意对象

b.同步方法(仅适用于实现runable接口)

public synchronized voidsellTicket(){同步代码}

this

c.静态同步方法

类的字节码对象

public static synchronized voidsellTicket() {

需要同步的代码

}

public class MyThread implements Runnable{

//定义100张票

int ticket = 100;

Object obj = new Object();

public void run() {

while (true) {

//同步代码块

synchronized (obj) {//3个线程才可以共享同一把锁

if (ticket>0) {

//考虑到实际,我们需要给每一个线程加入一定的延迟,模拟一下这种效果

try {

Thread.sleep(100);

/**

* 分析:为什么会出现两张100张票

* t1抢占到cpu的执行权,此时ticket=100,但是此刻休眠了

* 此时被t2抢占到了cpu的执行权,此时ticket=100,

* t1,t2分别睡了100毫秒之后,分别醒来了

* t1此时出售第100张票

* t2此时出售第100张票

*/

/**

* 分析:为什么会出现0张票和-1张票

* 假设此时票池中仅剩1张票了,

* t1进来休眠了

* t2进来休眠了

* t3进来休眠了

*/

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"正在出售第:"+ticket--+"张票");

}

}

}

}

}

public class Test {

public static void main(String[] args) {

//创建MyThread对象

MyThread mt = new MyThread();

//创建三个窗口

Thread t1 = new Thread(mt);

Thread t2 = new Thread(mt);

Thread t3 = new Thread(mt);

//给每一个窗口设置姓名

t1.setName("窗口一");

t2.setName("窗口二");

t3.setName("窗口三");

//开启窗口进行售票

t1.start();

t2.start();

t3.start();

}

}

(8)匿名内部类的方式使用多线程

new Thread() {

public void run() {

...

}

}.start();

new Thread(new Runnable(){

public void run() {

...

}

}).start();

(9) JDK5的Lock锁,我们之前造的所有的锁都没有手动释放锁

static Lock lock = new ReentrantLock();

枷锁:lock.lock();

释放锁:lock.unlock();

可以让我们明确的知道在哪里加锁和释放锁。

依然写一个卖票的demo,用lock枷锁释放锁,

为了保证我们创建的锁一定会被释放,用一下代码进行改进

try{....}finally{.....}

(10)死锁问题

同步嵌套,锁里面套了一个锁,出现同步嵌套

(11)线程等待和唤醒机制

锁对象调用wait()锁对象调用notify()

注意:

wait和sleep的区别

线程等待,在等待的同时释放锁,而sleep()方法在执行的过程中是不会释放锁的

时间: 2024-08-05 23:12:22

JAVA基础9(多线程)的相关文章

【BigData】Java基础_多线程

所谓的多线程就像小吃街卖铜锅米线的老板,老板就好比一个操作系统,如果5个顾客同时去买米线,那么,此时老板就会同时准备好5个铜锅,然后同时放上水.调料.米线,同时煮5个人的米线,如果逐个煮的话,那么估计煮了2个人的米线,后面3人就来找老板退款了. 官方解释:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术 在Java中实现多线程四部曲: (1)将需要用多线程方式执行的逻辑,写入一个runnable实现类中(run方法中): (2)创建出这个runnabl

Java基础4——多线程

线程依赖于进程而存在 进程:正在运行的程序 是操作系统进行资源分配和调度的独立单位 每个进程都有自己的内存空间和系统资源 多进程的意义:单进程的计算机只能做一件事情 DOS窗口就是典型的单进程 多进程的计算机可以在一个时间段内执行多个任务 单核CPU在某个时间点只能执行一件事情,事实上CPU一直在高效切换各个进程 线程:一个进程内可以执行多个任务,每个任务可以看成是一个线程,线程是程序(进程)的执行单元或执行路径,是程序使用CPU的最小单位 多线程的意义:提高应用程序的使用率 程序的执行都是在抢

3.8 java基础总结①多线程

多线程 多线程这章理论大于实践,因为在实际开发中多线程的都封装到框架里边了的,程序员一般不会写多线程,多线程属于Java里边比较底层的代码了. 线程是处理器调度的最基本单位程序>进程>线程程序是死的,当启动程序得时候会有一个或几个进程,每个进程里边可以有诺干线程.基于线程开销更 创建线程:两种方法1.声明Thread的子类,重写run方法class MyThread extends Thread{ public void run(){ }}Mythread a = new MyThread()

Java基础知识—多线程编程(五)

概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源,提高工作效率. 线程生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程. 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 就绪状态: 当线程对象调用了start()方法之后,该

java基础之多线程

参考博客 http://www.mamicode.com/info-detail-517008.html 1.进程和线程的区别 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小. 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行. 2.实现R

java基础及多线程

1.多线程 1.1.进程与线程 ? 进程就是一个运行中的程序. ? 一个进程中可以有多个线程,线程是CPU调度和分派的基本单位.我们可以理解为线程就是程序运行中的一条路径. 1.2.多线程的创建及使用 1.2.1.创建 自定义一个类继承Thread类或实现Runnable接口 1.2.2:两种创建多线程的区别 继承Thread类:Thread()或Thread(String name) 多个线程分别完成自己的任务 实现Runnable接口:Thread(Runnable target) 或Thr

java基础07 多线程

在学习操作系统时,我们会学习进程和线程,那么进程和线程又是什么东西呢? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程(thread)是操作系统能够进行运算调度的最小单位. 它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. Java程序运行原理 java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一

黑马程序员-Java基础之多线程

多线程 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺序. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量. jvm在启动的时,首先有一个主线程,负责程序的执行,调用的是main函数.主线程执行的代码都在main方法中. 当产生垃圾时,收垃圾的动作,

Java基础总结--多线程总结2

----多线程通信-----1.概述:多个线程处理同一个资源,但是各自的任务不相同eg:线程1负责存储数据,线程2负责处理该数据.数据--就是同一个资源怎样用java语言描述上面的例子:* 资源是变化的--数据是变化的--将其封装为对象* 存在两个任务不同的线程,需要2个run方法--所以封装在两个不同的线程类中* 必须保证输入和输出处理的是同一个对象-输入输出构造方法传参数(参数为资源对象引用)* 主函数里面,创建资源对象,线程类对象,启动线程2.多线程通信依然会出现线程安全的问题解决办法--

【黑马程序员】-Java基础学习-多线程

------- android培训.java培训.期待与您交流! --------- 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小. 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行.