创建线程的方法
继承thread类
继承Thread类并重写run方法
public class TestThread extends Thread {
@Override
public void run() {
super.run();
System.out.println("执行Thread.run");
}
}
调用继承Thread类的start方法启动线程
TestThread thread = new TestThread();
thread.start();
运行结果
执行Thread.run
Process finished with exit code 0
实现Runnable接口
实现接口并重写run方法
public class TestRunnable implements Runnable {
@Override
public void run() {
System.out.println("执行Runnable中的run方法");
}
}
启动线程
Thread thread = new Thread(new TestRunnable());
thread.start();
运行结果
执行Runnable中的run方法
Process finished with exit code 0
可以在new Thread时传入一个string用来标记线程
Thread thread = new Thread(new TestRunnable(), "t-1");
在run方法中使用以下方法获取
Thread.currentThread().getName();
继承方式和实现接口方式的异同
相同
- 都需要Thread类启动run、start方法
区别
- 继承Thread:线程代码存放Thread子类run方法中
- 实现Runnable接口:线程代码存在接口的子类的run方法中
使用实现Runnable接口的好处
- 避免了单线程的局限性
- 多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源。
多线程的优点
- 提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
- 提高计算机系统CPU的利用率。
- 改善程序结构。将即长又复杂的进程分为多个线程,独立运行,利于理解和修改。
Thread类的相关方法
run();//线程在就绪状态进入运行状态时执行的方法
void start();//启动线程,使线程进入就绪状态
String getName();//返回线程的名称
void setName(String name);//设置线程的名称
static currentThread();//返回当前线程
/**
* 线程让步
* 暂停当前正在执行的线程,把执行机会让给优先级相同或者更高的线程
* 若队列中没有同优先级的线程,忽略此方法
*/
static void yield();
/**
* 当某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,知道join方法加入的线程执行完为止
* 低优先级的进程也可以获得执行
*/
join();
/**
* 令当前活动线程在指定的时间段内放弃对cpu的控制,使其他线程有机会被执行,时间到后重排队
* 抛出InterruptedException异常
*/
static void sleep(long millis);
stop();//强制线程生命周期结束
boolean isAlive();//返回boolean,判断线程是否还活着
线程的优先级
-
线程有多大的概率会被执行
-
优先级使用1-10表示,数字越大优先级越高,默认优先级为5。
-
MAX_PRIORITY 10
-
MIN_PRIORITY 1
-
NORM_PRIORITY 5
相关方法
getPriority();//返回线程优先级
setPriority(int newPriority);//修改线程的优先级
- 注:线程创建时继承父线程的优先级
- 优先级只能增大被执行的概率,并不是绝对的
线程的生命周期
线程同步
- 多个线程执行的不确定性会引起执行结果的不稳定
- 多个线程对账本的共享,会造成操作的不完整性,会破坏数据
使用synchronized同步
//在方法上声明
public synchronized void show(String name){
//thing
}
synchronized(对象){
//需要同步的代码
}
线程的死锁
- 不同的线程分别占用对方需要的同步资源不放手,都在等待对方自己需要的同步资源,就形成了线程的死锁。
解决办法
- 专门的算法、原则,比如加锁顺序一致
- 尽量减少同步资源的定义,尽量避免锁未释放的场景
线程的通信
wait();//林当前线程挂起,同步资源,使别的线程可访问并修改共享资源
notify();//唤醒正在排队等待铜鼓资源的线程中优先级最高者
notifyAll();//唤醒正在排队等待资源的所有线程结束等待
- 注:这三个方法只有在synchronized方法或者代码块中才可以使用