常用方法
-
start() 启动线程并执行run()方法
-
run() 线程任务封装在run()中
-
currentThread() 静态的获取当前线程对象的引用
-
getName() 获取线程的名字
用法演示:Thread.currentThread().getName(); -
setName() 改变当前线程的名字
用法演示:Thread.currentThread().setName(“取个名字吧”); -
sleep(long 100) 让正在执行的线程睡眠100毫秒
-
getPriority() 返回当前线程的优先级
-
setPriority(int newPriority) 设置线程优先级
设置级别:MAX(值10) NORM(值5) MIN(值0)
用法演示:Thread.currentThread().setPriority(Thread.MAX_PRIORITY); -
jion() 主要作用是同步,让并行执行变成顺序执行
-
interrupt() 线程中断方法
扫描二维码关注公众号,回复: 10187168 查看本文章 -
yield() 静态的 当前线程释放当前cpu的执行权,效果不明显,可能被线程调度
线程状态
线程案例(卖票)
问题描述:火车站有三个窗口,一共买100张票,用多线程模拟一下窗口买票过程。
问题分析:
- 三个窗口要开三个线程
- 共同买一百张票,所以票要放在一个区域(例如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--;
}
}
}