start()
方法。start()
方法,但调度程序还未将其选为可运行线程。run()
方法完成。线程一旦死亡,不可复生(调用start()会抛异常
)。每个Java程序都有一个默认的主线程。
当JVM加载代码,发现main方法后,会立即启动一个线程(主线程)
主线程特点
run()
方法start()
方法启动线程run()
方法start()
方法启动线程run()
方法执行结束后,线程结束。setName()
//给子线程命名
//默认为Thread-
Thread1 t1=new Thread1();
Thread t=new Thread(t1);
t.start();
t.setName("t1");
//获取主线程,并命名
Thread.currentThread().setName("mm");
System.out.println(Thread.currentThread().getName());
this
Thread.currentThread()
//Runnable
//多线程解决同一问题
Thread1 t1 = new Thread1();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
//Thread
//资源不共享
Thread t1 = new Thread1();
Thread t2 = new Thread2();
Thread t3 = new Thread3();
t1.start();
t2.start();
t3.start();
方法名 | 功能 |
---|---|
start() | 启动线程,让线程从新建状态进入就绪状态队列 |
run() | 普通方法,线程对象被调度后执行的操作 |
sleep() | 暂停线程的执行,休眠线程 |
yield() | 暂停正在执行的线程,让同等优先级的线程运行 |
join() | 暂停当前线程的执行,等调用该方法的线程执行完后,线程返回就绪状态 |
interrupt() | 唤醒休眠的线程 |
stop() | 终止线程 |
isAlive() | 测试线程的状态;新建/死亡状态=false |
currentThread() | 返回当前正在执行线程对象的引用 |
//输出 (新建状态、死亡状态为false)
//false false
//join方法将主线程暂停,先执行Thread1线程
Thread1 t1=new Thread1();
Thread t=new Thread(t1);
System.out.print(t.isAlive());
t.start();
t.join();
System.out.print(t.isAlive());
setPriority()
方法设置线程优先级
Thread.MIN_PRIORITY
——1Thread.NORM_PRIORITY
——5Thread.MAX_PRIORUTY
——10getPriority()
方法得到线程优先级当线程池中的线程具有相同优先级:
多线程运行时,JVM按优先级调度,级别相同的由操作系统按时间片分配。
当线程睡眠时,暂停执行;苏醒前不会回到就绪状态;
当睡眠时间到期,线程回到就绪状态。
sleep()
指定时间为最短睡眠时间sleep()
为静态方法,只能控制当前运行的线程线程让步,暂停当前正在执行的线程对象,并执行同等优先级的其他线程
yield()使线程从运行状态——>就绪状态;让步的线程也有可能被线程调度程序选中。
线程A中调用线程B的join()
方法,让线程A置于线程B的尾部。
在线程B执行完毕之前,线程A一直处于阻塞状态,只有当B线程执行完毕时,A线程才能继续执行
当join(100)带有参数时,如果A线程中掉用B线程的join(100),则表示A线程会等待B线程执行100毫秒,100毫秒过后,A、B线程并行执行;同时join(0)==join()
join方法必须在线程start方法调用之后调用才有意义
在主线程中执行程序:创建A、B两个子线程,首先调用线程A的
start()
方法执行线程A;
调用线程A的join()
方法,使主线程进入阻塞状态,只有当线程A执行完毕后,才能执行主线程
线程A执行完毕后,主线程才可执行,调用线程B的start()
方法执行线程B。
Thread a = new ThreadA();
Thread b = new ThreadB();
//线程A开始执行
a.start();
//线程A调用join()
a.join();
//线程B开始执行
b.start();
Java每个对象都对应一个互斥锁的标记。
每个对象只有一个锁(lock)与之相关联.
synchronized
关键字与对象互斥锁联合使用,保证对象在任意时刻只能由一个线程访问。
避免多个线程进行访问导致数据不同步的问题。
//实现Runnable接口
public class Thread1 implements Runnable {
private static int count;
@Override
public void run() {
// TODO Auto-generated method stub
// 1. 修饰代码块
// 同步语句块
synchronized (this) {
for (int i = 0; i < 5; i++) {
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
}
}
// 同一个对象
//实现资源共享、资源同步
Thread1 thread = new Thread1();
new Thread(thread).start();
new Thread(thread).start();
// 不同对象
//实现资源同步、多线程进行处理
Thread1 thread = new Thread1();
Thread1 thread1 = new Thread1();
new Thread(thread).start();
new Thread(thread1).start();
synchronized
不可继承synchronized
修饰synchronized
修饰,但可以用同步代码块public synchronized void print(){
//todo
}
public synchronized static void print(){
//todo
}
class ClassTest{
public void method(){
synchronized(ClassTest.class){
//todo
}
}
}
为了更好的解决多个交互线程之间的运行进度。
引入wait()
方法与notify()
方法
wait()方法:使当前线程进行等待状态
notify()方法:通知那些等待该对象锁的其他线程,使其重新获取该对象的对象锁。
wait()
与notify()
方法必须配合synchronized
关键字使用wait()
会释放锁,notify()
不会释放锁wait()
方法执行后,执行interrupt()
方法会报异常死锁:当两个或两个以上的线程在执行过程中时,因争夺资源造成互相等待,若无外力作用,线程都无法推进下去的现象。
必要条件:
[java 线程方法join的简单总结][join]
[Java中Runnable和Thread的区别][thread]
[Java中Synchronized的用法][synchronized]
[join]:https://www.cnblogs.com/lcplcpjava/p/6896904.html
[thread]:https://developer.51cto.com/art/201203/321042.htm
[synchronized]:https://www.cnblogs.com/fnlingnzb-learner/p/10335662.html
原文:https://www.cnblogs.com/occlive/p/13673559.html