Java中的多线程

Java,实现多线程需要使用Thread.

Thread类的定义

public class Thread extends Object implements Runnable

   

void

run()

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

void

start()

使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

   

实现多线程方式1:

自定义类继承Thread.

在自定义类中重写run()方法.

创建对象.

启动线程

   

   

   

线程有两种调度模型

分时调度模型

所有的线程轮流使用CPU的使用权,平均分配每个线程占用的CPU时间片.

抢占式调度模型

优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取CPU时间片相对多一些.

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

   

Thread类的方法

线程的优先级的设置

java.lang.Thread

  

  

public static final int

MAX_PRIORITY

10

public static final int

MIN_PRIORITY

1

public static final int

NORM_PRIORITY

5

   

线程的休眠的设置

static void

sleep(long millis)

在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

   

   

线程的礼让

static void

yield()

暂停当前正在执行的线程对象,并执行其他线程。

   

线程礼让能在一定的程序上让线程分配更均衡一些.

   

守护线程

   

void

setDaemon(boolean on)

将该线程标记为守护线程或用户线程。

   

被标记为守护线程的程序,在主线程退出后守护线程也推出.

   

线程终止

public final void stop()

强迫线程停止执行。

stop方法官方不建议使用, stop会直接停止掉线程,不会继续向下执行.具有安全隐患.

   

   

终止线程

void

interrupt()

中断线程。

   

把线程的状态中止,并抛出一个异常.

   

   

实现多线程方式二

自定义类实现Runable接口

在自定义类中重写run方法

创建自定义类的对象.

创建Thread类的对象,并把自定义类的对象作为构造参数传递.

   

   

   

练习题,模拟售票程序,假设一共100张票,有三个窗口同时售票.

方式 1,继承Thread类的方式

   

   

方式2,实现Runable接口的方式.

   

   

为了模拟真实情况,将程序里设置100ms的延迟.

   

从结果种可以看出,有一张票卖出两次的情况以及卖出负数票的情况

   

   

有那些问题会导致出问题?

是否多线程环境

是否有共享数据

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

   

利用synchronized 可以解决此问题. 被synchronized所包含的代码,在任意时刻只能有一个对象执行.

   

synchronized 关键字同样可以修饰方法

   

同步代码块的锁对象

任意对象

同步方法的格式及锁对象

把同步关键字加在方法上.

被同步修饰的方法的所对象是?

this,也就是说如果在方法外也有同样的代码需要被锁上,需要同步对象 this.

静态方法及锁对象问题

静态方法的锁对象是类的字节码文件对象.(例如SellTicket.class)

   

创建线程安全的集合类的方法

猜你喜欢

转载自www.cnblogs.com/pecar/p/8969904.html