Java多线程编程

1、线程的实现

继承Thread类或者实现Runnable接口
class MyThread extends Thread {
	String Name;

	public MyThread(String Name) {
		this.Name = Name;
	}

	public void run() {
		for (int i = 0; i < 99; i++) {
			System.out.println(Name + ":" + i);
		}
		super.run();
	}

}

class MyRunnable implements Runnable{

	String Name;
	public MyRunnable(String Name) {
		this.Name = Name;
	}
	public void run() {
		for (int i = 0; i < 99; i++) {
			System.out.println(Name+":"+i);
		}
	}
	
}


public class Lmt02 {

	public static void main(String[] args) {
		//通过继承Thread类实现线程
		MyThread myThread1 = new MyThread("myThread - A");
		MyThread myThread2 = new MyThread("myThread - B");
		myThread1.start();//线程通过star()启动,哪个线程抢到cpu资源,谁执行
		myThread2.start();
		
		//通过实现Runnable接口实现线程
		MyRunnable myRunnable1 = new MyRunnable("myRunnable - A");
		MyRunnable myRunnable2 = new MyRunnable("myRunnable - B");
		Thread T1 = new Thread(myRunnable1);
		Thread T2 = new Thread(myRunnable2);
		T1.start();
		T2.start();
		
	}

}

2、线程的状态

创建状态:准备好了一个多线程的对象
就绪状态:调用了start()方法,等待CPU进行调度
运行状态:执行run()方法
阻塞状态:暂时停止执行,可能将资源交给其他线程使用
终止状态(死亡状态):线程销毁

3、线程的常用方法

class RunnableDemo implements Runnable {

	String Name;

	public RunnableDemo(String Name) {
		this.Name = Name;
	}

	public void run() {
		for (int i = 0; i < 66; i++) {
			try {
				Thread.sleep(1000);// 沉睡时间1S,即:每隔一秒该线程执行一次
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			if (Name.equals("MyRunnable - A") && i == 30) {
				Thread.yield();// 线程礼让
				System.out.println("线程礼让");
			} else {
				System.out.println("当前线程 " + Name + i + " 对象:" + Thread.currentThread());// 得到当前线程
				System.out.println("当前线程 " + Name + i + " 名称:" + Thread.currentThread().getName());// 得到当前线程名称
			}
		}
	}
}

public class Lmt03 {

	public static void main(String[] args) {
		RunnableDemo myRunnable1 = new RunnableDemo("MyRunnable - A");
		RunnableDemo myRunnable2 = new RunnableDemo("MyRunnable - B");
		RunnableDemo myRunnable3 = new RunnableDemo("MyRunnable - C");
		Thread T1 = new Thread(myRunnable1);
		Thread T2 = new Thread(myRunnable2);
		Thread T3 = new Thread(myRunnable3);
		System.out.println("T1线程是否启动:" + T1.isAlive());// 判断线程是否启动isAlive()
		T1.start();
		System.out.println("T1线程是否启动:" + T1.isAlive());
		System.out.println("T2线程是否启动:" + T2.isAlive());
		T2.start();
		System.out.println("T2线程是否启动:" + T2.isAlive());
		T3.start();
		for (int i = 0; i < 66; i++) {
			if (i > 33) {
				try {
					T3.join();// 强行执行线程
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("主线程:" + i);
		}
	}

}

线程挂起:suspend()

线程从挂起状态恢复:resume()

线程停止:stop()(不安全)

这三个容易引起死锁。


4、线程优先级

优先级
1 MIN_PRIORITY
5 NORM_PRIORITY
10 MAX_PRIORITY
不设置时默认值:5
优先级越高得到CPU资源的概率就越高
class RunnableDemo implements Runnable {

	String Name;

	public RunnableDemo(String Name) {
		this.Name = Name;
	}

	public void run() {
		for (int i = 0; i < 66; i++) {
			try {
				Thread.sleep(1000);// 沉睡时间1S,即:每隔一秒该线程执行一次
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("当前线程 " + Name + i + " 对象:" + Thread.currentThread());// 得到当前线程
			System.out.println("当前线程 " + Name + i + " 名称:" + Thread.currentThread().getName());// 得到当前线程名称
		}
	}
}

public class Lmt03 {

	public static void main(String[] args) {
		RunnableDemo myRunnable1 = new RunnableDemo("MyRunnable - A");
		RunnableDemo myRunnable2 = new RunnableDemo("MyRunnable - B");
		RunnableDemo myRunnable3 = new RunnableDemo("MyRunnable - C");
		Thread T1 = new Thread(myRunnable1);
		Thread T2 = new Thread(myRunnable2);
		Thread T3 = new Thread(myRunnable3);

		T1.setPriority(Thread.MIN_PRIORITY);// 设置优先级MIN_PRIORITY
		T2.setPriority(Thread.NORM_PRIORITY);// 设置优先级NORM_PRIORITY
		T3.setPriority(Thread.MAX_PRIORITY);// 设置优先级MAX_PRIORITY

		T1.start();
		T2.start();
		T3.start();
	}

}

5、线程同步与死锁

同步代码块格式:
synchronized (同步对象) {
			需要同步的代码块;
		}

class RunnableDemo implements Runnable {

	private int ticketsNumber = 33;

	public void run() {
		for (int i = 0; i < 33; i++) {
			synchronized (this) {
				if (ticketsNumber > 0) {
					try {
						Thread.sleep(999);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("在" + Thread.currentThread().getName() + "买到的车票座位号:" + ticketsNumber--);
				}
			}
		}

	}
}

public class Lmt01 {

	public static void main(String[] args) {
		RunnableDemo runnableDemo = new RunnableDemo();// 资源共享
		Thread T1 = new Thread(runnableDemo, " 1 号窗口");
		Thread T2 = new Thread(runnableDemo, " 2 号窗口");
		Thread T3 = new Thread(runnableDemo, " 3 号窗口");
		T1.start();
		T2.start();
		T3.start();
	}

}

运行结果:

在 1 号窗口买到的车票座位号:33
在 1 号窗口买到的车票座位号:32
在 1 号窗口买到的车票座位号:31
在 3 号窗口买到的车票座位号:30
在 2 号窗口买到的车票座位号:29
在 2 号窗口买到的车票座位号:28
在 3 号窗口买到的车票座位号:27
在 1 号窗口买到的车票座位号:26
在 1 号窗口买到的车票座位号:25
在 1 号窗口买到的车票座位号:24
在 3 号窗口买到的车票座位号:23
在 3 号窗口买到的车票座位号:22
在 3 号窗口买到的车票座位号:21
在 3 号窗口买到的车票座位号:20
在 3 号窗口买到的车票座位号:19
在 3 号窗口买到的车票座位号:18
在 3 号窗口买到的车票座位号:17
在 3 号窗口买到的车票座位号:16
在 3 号窗口买到的车票座位号:15
在 2 号窗口买到的车票座位号:14
在 2 号窗口买到的车票座位号:13
在 2 号窗口买到的车票座位号:12
在 2 号窗口买到的车票座位号:11
在 2 号窗口买到的车票座位号:10
在 2 号窗口买到的车票座位号:9
在 2 号窗口买到的车票座位号:8
在 2 号窗口买到的车票座位号:7
在 2 号窗口买到的车票座位号:6
在 2 号窗口买到的车票座位号:5
在 3 号窗口买到的车票座位号:4
在 3 号窗口买到的车票座位号:3
在 3 号窗口买到的车票座位号:2
在 3 号窗口买到的车票座位号:1




方法同步格式:
synchronized Void 方法名称(){
			
		}

class RunnableDemo implements Runnable {

	private int ticketsNumber = 33;

	public void run() {
		for (int i = 0; i < 33; i++) {
			sell();
		}

	}

	public synchronized void sell() {
		if (ticketsNumber > 0) {
			try {
				Thread.sleep(999);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("在"+Thread.currentThread().getName()+"买到的车票座位号:" + ticketsNumber--);
		}
	}
}

public class Lmt01 {

	public static void main(String[] args) {
		RunnableDemo runnableDemo = new RunnableDemo();// 资源共享
		Thread T1 = new Thread(runnableDemo," 1 号窗口");
		Thread T2 = new Thread(runnableDemo," 2 号窗口");
		Thread T3 = new Thread(runnableDemo," 3 号窗口");
		T1.start();
		T2.start();
		T3.start();
	}

}



运行结果:
在 1 号窗口买到的车票座位号:33
在 1 号窗口买到的车票座位号:32
在 3 号窗口买到的车票座位号:31
在 3 号窗口买到的车票座位号:30
在 3 号窗口买到的车票座位号:29
在 2 号窗口买到的车票座位号:28
在 2 号窗口买到的车票座位号:27
在 2 号窗口买到的车票座位号:26
在 2 号窗口买到的车票座位号:25
在 2 号窗口买到的车票座位号:24
在 2 号窗口买到的车票座位号:23
在 2 号窗口买到的车票座位号:22
在 2 号窗口买到的车票座位号:21
在 2 号窗口买到的车票座位号:20
在 3 号窗口买到的车票座位号:19
在 3 号窗口买到的车票座位号:18
在 1 号窗口买到的车票座位号:17
在 1 号窗口买到的车票座位号:16
在 3 号窗口买到的车票座位号:15
在 3 号窗口买到的车票座位号:14
在 3 号窗口买到的车票座位号:13
在 3 号窗口买到的车票座位号:12
在 2 号窗口买到的车票座位号:11
在 2 号窗口买到的车票座位号:10
在 2 号窗口买到的车票座位号:9
在 2 号窗口买到的车票座位号:8
在 2 号窗口买到的车票座位号:7
在 2 号窗口买到的车票座位号:6
在 2 号窗口买到的车票座位号:5
在 3 号窗口买到的车票座位号:4
在 3 号窗口买到的车票座位号:3
在 3 号窗口买到的车票座位号:2
在 3 号窗口买到的车票座位号:1



你可能感兴趣的:(Java学习笔记)