黑马程序员_多线程1

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

今天复习的内容主要是多线程,这块知识点还是比较多的,主要有线程与进程的异同点、实现多线程的方法、对多线程操作的方法、线程的状态、多线程的同步、线程间的通信、线程生命周期等。

       一、 线程与进程的异同:

1、同样作为基本的执行单元,线程是更小的指向单位,一个进程中可以有多个线程;

2、每个进程都有自己独立的内存区域,而线程却可以使共享内存单元,这样通过共享的内存单元来实现数据的实时通讯。

      二、 实现多线程的方法:

1、通过继承Thread类实现多线程;

在定义的类中继承Thread并覆写Thread类的run()方法,把需要多线程的语句写在run()方法中。

在创建的对应类的实例中调用start()方法,启动了多线程。

2、通过实现Runnable接口实现多线程;

Runnable接口中只有一个run()抽象方法,因此要实现此方法,把需要多线程的语句写在run()方法中。

实例化这个类,创建对应对象,通过这个对象去实例化一个Thread类对象,之后调用start()方法启动多线程

      三、  这两种多线程机制的比较:

1、查阅JDK发现Thread类实现了Runnable接口,

2、实现Runnable接口适合于相同程序代码的线程去处理同一资源

3、实现Runnable接口可以避免Java单继承的局限

4、代码与数据独立,增强健壮性;因此第二种方法使用更广泛。

       四、对多线程操作的方法,常用的有:

getName()获取线程名称;setName()设置线程名称;isAlive()线程是否启动,返回boolean型值;sleep()静态方法用于线程休眠,可以设定休眠时间;interrupt()中断线程;

      五、线程的状态:被创建、运行、冻结、阻塞、消亡

      六、多线程的同步

1、问题的引出:当多线程操作的是某一共享数据,并且操作这一共享数据的语句不只一句,就有可能引发同步问题。产生的原因就是,当某个线程在这些语句中运行一半时,将执行权交给了同类的另外一个线程。这时这个共享数据就会出现不同步现象。只有把这些操作共享数据的语句的原子性,就是只要程序执行到这些语句,就要一直执行下去,不能让其他线程执行。

2、同步代码块与同步函数

同步代码块的锁是任意的对象,而同步函数的锁是this,静态同步函数的锁是this.getClass()

同步虽然解决了线程的安全问题,但是相对降低了效率,因为同步外的线程的都会判断同步锁,同步中必须有多个线程并使用同一个锁。

     七、死锁:多个线程同时争用多个锁,就有可能出现死锁

如:线程1持有对象A上的锁,而且正在等待对象B上的锁;而线程2持有对象B上的锁,却正在等待对象A上的锁。那么这两个线程永远不会获取第二个锁,也不会释放第一个锁,这就出现了死锁。下面是死锁的实例:
   

package itcast;
public class DeadLock {
	public static void main(String[] args) {
		new Thread(new LockTest(true)).start();
		new Thread(new LockTest(false)).start();
		
	}
}

class LockTest implements Runnable{
	private boolean flag;
	LockTest(boolean flag){
		this.flag = flag;
	}
	public void run() {
		if(flag){
			while(true){
				synchronized (MyLock.locka) {
					System.out.println(Thread.currentThread().getName()+"...if的locka锁");
					synchronized (MyLock.lockb) {
						System.out.println(Thread.currentThread().getName()+"...if的lockb锁");
					}
				}
			}
		}
		else{
			while(true){
				synchronized (MyLock.lockb) {
					System.out.println(Thread.currentThread().getName()+"...else的lockb锁");
					synchronized (MyLock.locka) {
						System.out.println(Thread.currentThread().getName()+"...else的locka锁");
					}
				}				
			}
		}
	}
}
class MyLock{
	public static final Object locka = new Object();
	public static final Object lockb = new Object();
}


 

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

详细请查看:http://edu.csdn.net
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值