Java--线程(Thread)常用方法+卖票实例演示

常用方法

  1. start() 启动线程并执行run()方法

  2. run() 线程任务封装在run()中

  3. currentThread() 静态的获取当前线程对象的引用

  4. getName() 获取线程的名字
    用法演示:Thread.currentThread().getName();

  5. setName() 改变当前线程的名字
    用法演示:Thread.currentThread().setName(“取个名字吧”);

  6. sleep(long 100) 让正在执行的线程睡眠100毫秒

  7. getPriority() 返回当前线程的优先级

  8. setPriority(int newPriority) 设置线程优先级
    设置级别:MAX(值10) NORM(值5) MIN(值0)
    用法演示:Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

  9. jion() 主要作用是同步,让并行执行变成顺序执行

  10. interrupt() 线程中断方法

    扫描二维码关注公众号,回复: 10187168 查看本文章
  11. yield() 静态的 当前线程释放当前cpu的执行权,效果不明显,可能被线程调度

线程状态

在这里插入图片描述

线程案例(卖票)

问题描述:火车站有三个窗口,一共买100张票,用多线程模拟一下窗口买票过程。
问题分析:

  1. 三个窗口要开三个线程
  2. 共同买一百张票,所以票要放在一个区域(例如static静态方法区),让着三个线程共同调用。
//第一种方法:继承
package com.ticket;

public class Ticket1 {
	public static void main(String[] args)
	{
		Window w1=new Window();
		Window w2=new Window();
		Window w3=new Window();
		w1.setName("窗口1");
		w2.setName("窗口2");
		w3.setName("窗口3");
		w1.start();
		w2.start();
		w3.start();
		
	}
	
}
class Window extends Thread{

	static int Tickets=100;     //静态方法区的100张票
	@Override
	public void run() {
		while(true)     
		{			 
			//如果票没买完就一直执行
			if(Tickets>0)
			{		
				System.out.println(Thread.currentThread().getName()+"卖票,票号是:"+Tickets);
				Tickets--;
			}
			else 
			{
			break;
			}
		}
	}	
}

执行结果为(截取一部分):
在这里插入图片描述

//第二种方式:接口
package com.ticket;

public class Ticket1 {
	public static void main(String[] args)
	{
		Window w=new Window();   //票是共享数据		
		Thread t1=new Thread(w);
		Thread t2=new Thread(w);
		Thread t3=new Thread(w);
		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		t1.start();
		t2.start();
		t3.start();
		
	}
	
}
class Window implements Runnable{

	private int Tickets=100;     //静态方法区的100张票
	@Override
	public void run() {
		while(true)     
		{			 
			//如果票没买完就一直执行
			if(Tickets>0)
			{		
				System.out.println(Thread.currentThread().getName()+"卖票,票号是:"+Tickets);
				Tickets--;
			}
			else 
			{
			break;
			}
		}
	}	
}

执行结果(截取一部分)
在这里插入图片描述

线程同步问题

同步:指进程必须按照顺序依次对资源进行访问
异步:指进程之间没有相互约束

线程同步的实现,在需要限制线程进入的地方加synchronized(对象)
例如:

//利用同步代码块
package com.ticket;

public class Ticket1 {
	public static void main(String[] args)
	{
		Window w=new Window();   //票是共享数据		
		Thread t1=new Thread(w);
		Thread t2=new Thread(w);
		Thread t3=new Thread(w);
		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		t1.start();
		t2.start();
		t3.start();
		
	}
	
}
class Window implements Runnable{

	private int Tickets=100;     //静态方法区的100张票
	@Override
	public void run() {
		while(true)     
		{			 
			//同步代码块
			synchronized(this)      //this指的是Window定义的对象
			{
			if(Tickets>0)
			{		
				System.out.println(Thread.currentThread().getName()+"卖票,票号是:"+Tickets);
				Tickets--;
			}
			else {
				break;
			}
			}
		}
	}	
}

//利用同步方法
package com.ticket;

public class Ticket1 {
	public static void main(String[] args)
	{
		Window w=new Window();   //票是共享数据		
		Thread t1=new Thread(w);
		Thread t2=new Thread(w);
		Thread t3=new Thread(w);
		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		t1.start();
		t2.start();
		t3.start();
		
	}
	
}
class Window implements Runnable{

	private int Tickets=100;     //静态方法区的100张票
	@Override
	public void run() {
		while(true)     
		{			 					
			show();			
		}
		
	}	
	//利用同步方法
	public synchronized void show(){
		if(Tickets>0)
			{		
				System.out.println(Thread.currentThread().getName()+"卖票,票号是:"+Tickets);
				Tickets--;
			}			
		}
}

发布了55 篇原创文章 · 获赞 47 · 访问量 3528

猜你喜欢

转载自blog.csdn.net/qq_42577542/article/details/104360022