5.多线程的实现方式一:继承Thread类,重写run()方法
A:常用功能
public final String getName():获取线程的名称
public final void setName(String name):设置线程的名称(也可用带参构造方法为线程设置名称)
public static Thread currentThread():返回当前正在执行的线程对象
Thread.currentThread().getName():返回当前正在执行的线程对象的名称
public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程
注意:当正在运行的线程都是守护线程时,Java虚拟机退出。
public final void join():等待该线程终止
public final int getPriority():返回线程对象的优先级
public final void setPriority(int newPriority):设置线程的优先级
注意:线程优先级的范围是1-10,默认为5.线程优先级高仅仅代表线程获取的CPU时间片的几率高
public static void sleep(long millis):线程休眠
public final void stop():线程停止,该方法已过时,但仍然可以使用
public void interrupt():中断线程,终止线程状态,并抛出一个InterruptedException异常
public static void yield():暂停当前正在执行的线程对象,并执行其他线程
注意:该方法可以让线程执行更加和谐,但无法保证一人一次的执行。
B:电影院三窗口售票案例方式一实现
public class SellTicket extends Thread{
private static int tickets = 100;
public void run(){
while(true){
if(tickets > 0){
System.out.println(getName() + "正在出售第" + (tickets--) + "张票")
}
}
}
}
public class SellTicketDemo{
public static void main(String[] args){
SellTicket st1 = new SellTicket();
SellTicket st1 = new SellTicket();
SellTicket st1 = new SellTicket();
st1.setName("窗口1");
st2.setName("窗口2");
st3.setName("窗口3");
st1.start();
st2.start();
st3.start();
}
}
6.多线程的实现方法二:实现Runnable接口,重写run()方法。
A:电影院三窗口售票案例方式二实现
public class SellTicket implements Runnable{
private int tickets = 100;
public void run(){
while(true){
if(tickets > 0){
System.out.println(Thread.currentThread().getName() + "正在出售第"
+ (tickets--) + "张票");
}
}
}
}
public class SellTicketDemo{
public static void main(String[] args){
SellTicket st = new SellTicket();
Thread t1 = new Thread(st,"窗口1");
Thread t2 = new Thread(st,"窗口2");
Thread t3 = new Thread(st,"窗口3");
t1.start();
t2.start();
t3.start();
11.死锁问题
A:死锁
两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象
B:代码演示
public class MyLock{
//创建两个锁对象
public static final Object objA = new Object();
public static final Object objA = new Object();
}
public class DieLock extends Thread{
private boolean flag;
public DieLock(boolean flag){
this.flag = flag;
}