Java高级_Day16(Runnable实现多线程,线程的同步,线程的死锁)
Runnable实现多线程
Thread(Runnable target)
分配一个新的 Thread对象。
Thread(Runnable target, String name)
分配一个新的 Thread对象。
Runnable接口应由任何类实现,其实例将由线程执行。 该类必须定义一个无参数的方法,称为run
public class RunnableThread implements Runnable{
@Override
public void run() {
for(int i = 0;i < 100;i++){
System.out.println(Thread.currentThread().getName() + "----" +i);
}
}
}
public class RunnableThreadTest {
public static void main(String[] args) {
//创建线程
Runnable r = new RunnableThread();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r,"线程2");
//开始执行
t1.start();
t2.start();
//使用内部类创建线程
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0;i < 100;i++){
System.out.println(Thread.currentThread().getName() + "----" +i);
}
}
},"线程3");
t3.start();
//使用匿名内部类创建线程
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0;i < 100;i++){
System.out.println(Thread.currentThread().getName() + "----" +i);
}
}
},"线程4").start();
}
}
继承Thread类和实现Runnable接口
Java 是单继承 多实现
线程的同步
需求:模拟火车站售票厅售卖一趟列车车票的场景:售票厅有三个窗口 在同时售卖一列火车的车票,假设该列车共有100张票
public class Ticket implements Runnable{
//表示车票余量
private int tick = 100;
@Override
public void run() {
while(true){
//如果车票还有剩余,售票
if(tick > 0){
//售出每张票耗时10ms
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出售票信息
System.out.println(Thread.currentThread().getName() + "售出:" + tick-- + "号车票");
}
//车票售完
else{
System.out.println("车票已卖完");
break;
}
}
}
}
public class TickTest {
public static void main(String[] args) {
//创建三个售票窗口
Ticket ticket = new Ticket();
Thread t1 = new Thread(ticket,"1号窗口");
Thread t2 = new Thread(ticket,"2号窗口");
Thread t3 = new Thread(ticket,"3号窗口");
//三个窗口同时售票
t1.start();
t2.start();
t3.start();
}
}
这种问题就是线程安全问题
问题出现的原因:
- 多个线程同时操作共享数据,但是其中一个线程对共享数据的操作还没有完成,此时另一个线程就加入进来执行对共享数据的操作 ,导致了共享数据的错误
解决的方法:
- 对于多个线程操作共享数据时 在任何时刻,我们都保证只有一个线程在对共享数据进行操作,如果当前线程的操作没有完成,则不允许其他的线程进入参与执行。
线程同步的解决方案:同步机制:
同步代码块:
格式:
synchronized (同步锁){
需要同步的代码
}
public class Print {
Object obj = new Object();
//同步锁
public void print1(){
synchronized (obj){
System.out.print("中");
System.out.print("北");
System.out.print("大");
System.out.print("学");
System.out.println();
}
}
public void print2(){
synchronized (obj){
System.out.print("蓝");
System.out.print("桥");
System.out.print("学");
System.out.print("院");
System.out.println();
}
}
}
public static void main(String[] args) {
Print p = new Print();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
p.print1()