多线程基础(笔记)

多线程:如果一个进程中同时运行了多个线程用来完成不同的工作,则称之为多线程

多线程是抢占式执行策略
多线程并不是真正的并行,而是多个线程交替占用CPU资源

多线程的好处:
充分利用CPU资源
简化编程模型
带来良好的用户体验

main方法即为主线程入口
主线程产生其他子线程
主线程必须最后完成执行,因为它执行各种关闭动作

创建线程的两种方法:
1.继承Thread类:编写简单,可直接操作线程
2.实现Runnable接口:避免单继承局限性,便于共享资源

简单示例:

package thread_example;

/**
 * 继承Thread类创建线程
 * 
 * @author Administrator
 *
 */
public class MyThread extends Thread {

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("线程------" + i);
		}
	}

	public static void main(String[] args) {
		MyThread mt = new MyThread();
		mt.start();
	}
}
package thread_example;

/**
 * 实现Runnable接口创建线程
 * 
 * @author Administrator
 *
 */
public class MyThread2 implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("线程------" + i);
		}
	}
	public static void main(String[] args) {
		MyThread2 mt = new MyThread2();
		Thread thread=new Thread(mt);
		thread.start();
	}
}

线程的状态:
创建状态,阻塞状态,就绪状态,死亡状态,运行状态

Thread类常用方法:
static void sleep(long millis) 在指定毫秒内让当前线程休眠(暂停执行)
static void yield() 暂停当前正在执行的线程对象,并执行其他线程
void setPriority(int newPriority) 更改线程优先级
void join() 等待该线程终止
void interrupt() 中断线程
boolean isAlive() 测试线程是否处于活动状态

线程优先级:
1-10,1最低,10最高,默认为5

yield():礼让,只是提供一种可能,不能保证一定会实现礼让
sleep():线程执行该方法不会释放资源
interrupt() 并不能真正的中断线程,只是将线程标记为中断状态,interrupted()会导致中断状态清除

当多个线程共享同一个资源时,一个线程未完成全部操作,而这时其他线程修改了数据,就会出现数据不安全问题,

使用同步锁(synchronized)解决线程不安全问题

死锁:当两个线程都在等待对方先完成,造成程序的停滞
死锁条件:
两个或两个以上线程在活动
某个线程拿到第一个锁之后,还想拿第二个锁,造成锁的嵌套

死锁示例:

package Test_Temp;

/**
 * 死锁模拟
 * 
 * 多线程抢占同一个资源就有可能会产生死锁现象
 * 
 * sleep500ms模拟代码执行
 * 
 * @author Administrator
 *
 */
public class Synchronized_test {
	public static void main(String[] args) {
		Object lock1 = new Object();
		Object lock2 = new Object();

		Test1 test1 = new Test1(lock1, lock2);
		Test2 test2 = new Test2(lock1, lock2);

		Thread t1 = new Thread(test1);
		Thread t2 = new Thread(test2);

		t1.start();
		t2.start();

	}

}

class Test1 implements Runnable {

	Object lock1;
	Object lock2;

	public Test1(Object lock1, Object lock2) {
		super();
		this.lock1 = lock1;
		this.lock2 = lock2;
	}

	@Override
	public void run() {
		synchronized (lock1) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (lock2) {
			}
			System.out.println("这是线程1-------");
		}
	}

}

class Test2 implements Runnable {
	Object lock1;
	Object lock2;

	public Test2(Object lock1, Object lock2) {
		super();
		this.lock1 = lock1;
		this.lock2 = lock2;
	}

	@Override
	public void run() {
		synchronized (lock2) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (lock1) {
			}
			System.out.println("这是线程2-------");

		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值