
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());
thisThread.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