一、创建线程: 

package com.dong.testThread;
/**
 * 
 * 1.线程的创建
 * 2.线程的方法
 * 
 * @author liuD
 *
 */
public class MultiThread {
	public static void main(String[] args) throws InterruptedException {
		//创建线程1,使用实现Runnable接口的类,使用lambda表达式;
		Thread  trl =new Thread(() -> System.out.println(Thread.currentThread().getName()+ " thread start..."));
		trl.start();
		//使用实现Runnable接口的类,不使用lambda表达式;
		Thread tr = new Thread(new runnableExam());
		tr.start();
		//创建线程2,使用继承了Thread类来创建线程,使用默认的run()
		Thread th = new Thread();
		th.start();
		//创建线程3,使用继承了Thread类的实例做参数。使用重写的run()
		Thread th2 =new Thread(new threadExam());
		
	}
}
class threadExam extends Thread{
	public void run() {
		System.out.println(Thread.currentThread().getName()+ " thread2 start ...");
	}
}
class runnableExam implements Runnable{
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+ " thread start ...");
	}
	
}

二、线程的各个状态:

⑴新建: new()

package com.dong.testThread;
/**
 * 线程的new状态,即刚创建的线程
 * @author liuD
 */
public class TestNew {
	public static void main(String[] args) {
		//使用lambda创建线程;
		Thread t = new Thread(
				() -> System.out.println(Thread.currentThread().getName() + " will running")
				);
	}
}

⑵睡眠:sleep()

package com.dong.testThread;
/**
 * 测试Sleep功能,Sleep是让线程等待million毫秒后在执行
 * @author liuD
 */
public class TestSleep extends Thread{
	StringBuilder str = new StringBuilder();
	public static void main(String[] args) throws InterruptedException {
		Thread thread = new Thread(new TestSleep());
		long startTime  = System.currentTimeMillis();
		//⑵线程睡眠2秒
		thread.sleep(2000);
		long sleepTime  = System.currentTimeMillis();
		//注意这个结果不一定是2000
		System.out.println("thread has sleep "+ (sleepTime - startTime )+ " finish and will start ");
		thread.start();
	}
	public void run(){
		for(int i = 0 ;i< 10;i++) {
			str.append(".");
			System.out.println(str.toString());
		}
	}
}

⑶停止:stop()  (不建议使用)

package com.dong.testThread;
/**
 * 测试stop方法,stop方法会立刻释放锁资源,可能导致数据的不一致;
 * 
 * @author liuD
 *
 */
public class testStop {
	public static void main(String[] args) throws InterruptedException {
		new ReadObjectThread().start();
		while(true) {
			Thread t = new ChangeObjectThread();
			t.start();
			Thread.sleep(100);
			//调用stop()方法;
			t.stop();
		}
	}
}
class User{
	static int a = 0;
	static int b = 0;
	
	public static int getA() {
		return a;
	}
	public static int getB() {
		return b;
	}
	public static void setA() {
		a = a + 1;
	}
	public static void steB() {
		b = b + 1;
	}
}
class  ChangeObjectThread extends Thread{
	public  void run() {
		while(true) {
			synchronized(User.class) {
				User.setA();
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				User.steB();
			}
			Thread.yield();
		}
	}
}
class ReadObjectThread extends Thread{
	public void run() {
		while(true) {
			synchronized(User.class) {
				if(User.getA() != User.getB()) {
					System.out.println( "A = "+  User.getA() + " B = " + User.getB());
				}
			}
			Thread.yield();
		}
	}
}

⑷中断:interrupte()

package com.dong.testThread;
/**
 * 测试interrupte()方法
 * 当调用interrupte()方法,会给线程发送一个通知,告诉目标线程,该退出,至于如何退出,有目标线程自行决定;
 * interrrupte会通知目标线程中断,也就是设置中断标志位,中断标志位表示当前线程已经被中断了。
 * 刚调用interrupte()方法,相当于只设置了中断标志,但是这个中断不会发生任何作用;
 *如果想显示终止线程,可以使用Thread.currentThread().isInterrupted()方法,判断线程是否已经中断,可以显式中断线程;
 * @author liuD
 *
 */
public class TestInterrupt {
	public static void main(String[] args) throws InterruptedException {
		Thread thread = new Thread(new TThread());
		thread.start();
		thread.sleep(2000);
		//线程的中断不确定,设置了中断标志
		thread.interrupt();
		
		Thread tot = new Thread(new ToThread());
		tot.start();
		//线程的中断不确定,只是设置了中断标志
		tot.interrupt();
	}
}
class TThread implements Runnable{
	@Override
	public void run() {
		while(true) {
			//判断线程是否被中断,显式中断线程的执行;
			if(Thread.currentThread().isInterrupted()) {
				System.out.println(" Interrupted !!! ");
				break;
			}
			System.out.println("TT -----this is thread ...");
		}
		Thread.yield();
	}
}
class ToThread implements Runnable {
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			System.out.println("ToT-----this is thread ...");
		}
	}
	
}

⑸等待:wait()   

⑹唤醒:notify()

package com.dong.testThread;
/**
 * wait()方法和notify()方法是在object类中定义的,
 * wait()让当然线程等待,进入锁对象的等待队列,直到有线程调用notify()方法,才会从等待队列中随机选择一个等待线程进行唤醒,
 * notify()方法从等待队列总随机选择一个线程进行唤醒;
 * @author liuD
 *
 */
public class TestWaitAndNotify {
	final static Object object = new Object();
	public static void main(String[] args) {
		Thread t1  = new Thread(new ToThreads());
		t1.start();
		Thread t2 = new Thread(new ToT2Threads());
		t2.start();
	}

static class ToThreads implements Runnable{
	@Override
	public void run() {
		synchronized (object) {
			System.out.println(System.currentTimeMillis()+ " : T1 start ");
			try {
				System.out.println(System.currentTimeMillis()+": T1 wait for object" );
				object.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(System.currentTimeMillis()+": T1 end !");
		}
	}	
}
static class ToT2Threads implements Runnable{
	public void run() {
		synchronized(object) {
			System.out.println(System.currentTimeMillis()+ " :T2 start notify one thread");
			object.notify();
			System.out.println(System.currentTimeMillis()+ " : T2 end! ");			
			try {
				Thread.sleep(2000);
			}catch(InterruptedException e) {}
		}
	}
	}
}

⑻谦让:yield

package com.dong.testThread;
/**
 * yield()方法会让当前线程让出Cpu的执行权,停止执行,从而重新争取cpu的资源,
 * @author liuD
 */
public class testYield {
	public static void main(String[] args) {
		Thread t1 = new Thread(new T1());
		Thread t2 = new Thread(new T2());
		//多个线程之间的执行是随机的,因此使用yield()方法,看不出来谦让的效果,所以设置一个高优先级和低优先级线程,来观察yield()的效果
		t1.setPriority(10);
		t2.setPriority(1);
		t1.start();
		//可以注释掉t1.yield()语句,来观察输出结果之间的变化;
		t1.yield();
		t2.start();
	}
}
class T1 implements Runnable{
	@Override
	public void run() {
		for(int i = 0;i<20;i++) {
			System.out.println("i \' am a brothers");
		}
	}
}
class T2 implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int j =0;j<20;j++) {
			System.out.println("I \' am a sister");
		}
	}
}

⑼加入:join

package com.dong.testThread;
/**
 * 
 * yield()方法,它会阻塞当前线程,直到目标线程执行完毕,
 * @author liuD
 */
public class TestJoin {
	public static void main(String[] args) throws InterruptedException {
		Thread t1 = new Thread(new joinThread());
		t1.start();
		//阻塞主线程,其他线程愿意等待t1线程执行完毕在执行,这里其他线程指主线程,如果没有t1.join(),则两个线程的输出语句就会随机输出		
		t1.join();
		for(int i = 0 ;i< 1000;i++) {
			System.out.println(Thread.currentThread().getName() +" : " + i);
		}
	}
}
class joinThread implements Runnable{
	public void run() {
		for(int j = 0 ;j < 3;j++) {
		System.out.println(Thread.currentThread().getName()+ " :  start start start " );
		}
	}
}

 

⑽运行:start

就是创建线程后,启动启动线程的方法,threadObject.start()方法;

 

部分代码参考《Java 高并发程序设计》  --葛一鸣,郭超 ,,由衷感谢此书作者为我们提供学习内容