黑马程序员_java多线程

                                                          ----------------------android培训java培训、期待与您交流! ----------------------

 

 

        知识梳理:

 

     所谓的多线程就是指一个进程里面包含多个任务单元,在CPU和内存硬件支持范围内不停的切换运行,从而达到了在同一时间同时执行多项任务的效果!多线程能够提高执行效率,就好比我现在需要写完10篇日志,一个人写虽然慢,然是也能够完成! 如果有5个人一起来帮我写,那效率就会提高!一个进程中只要有一个线程活着,那么这个进程将不会死掉。

在Java里面需要实现多线程的方法有两种:

第一种:继承了Thread类,然后重写里面的run();方法,最后调用Thread里面的start();方法。

代码演示范例:

 

package com.fengfeng.Thread;

public class Thread1 extends Thread  //继承父类
{
	@Override
	public void run() //重写run方法
	{
		// TODO Auto-generated method stub
		for (int i = 0; i < 60; i++)
		{
			System.out.println(currentThread().getName() + ".....run" + i);
		}
	}
}


 

 

 第二种:利用Runnable接口实现类,重写里面的run();方法,实例一个Runnable的实现类的实例对象,实例一个Thread对象并且传入实现类的实力对象到构造方法,最后调用Thread里面的start();方法。

 

代码演示范例:

package com.fengfeng.Thread;

public class ThreadImpl implements Runnable {

	private int ii = 100;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		while (true) {
			synchronized (ThreadImpl.class) {
				if(ii>0)
				System.out.println(Thread.currentThread().getName() + ".....run" + ii--);
			}
		}
			
	}
	
	
	public static void main(String[] args) {
		ThreadImpl t = new ThreadImpl();
		
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		t1.start();
		t2.start();		
	
		for (int i = 1; i < 60; i++) {
			System.out.println("Main ...." + i);
		}
	}

}


 

 

 在多线程的6种状态:  分别为开启状态、睡眠状态、暂停状态、唤醒状态、结束状态、和特殊的阻塞状态(临时状态)。

代码演示:

	public static void main(String[] args) throws Exception{
		ThreadImpl t = new ThreadImpl();
		
		Thread t1 = new Thread(t);
		t1.start();//开启状态
		t1.sleep(10);//睡眠状态
		t1.notify();//唤醒状态
		t1.wait();//暂停状态
		t1.stop();//结束状态	
	
		for (int i = 1; i < 60; i++) {
			System.out.println("Main ...." + i);
		}
	}

}



 在多线程中会出现安全隐患,解决方法是将会出现问题的代码放入同步代码块当中或者是同步函数当中。

同步代码块代码演示:

synchronized (this.class) 
{
//.......问题代码
}


同步函数就简单了,直接把synchronized 当作函数的修饰符。

 

为了我们的代码、我们的程序更加的安全。我们使用同步代码块来解决。但是在使用同步代码块的同时也会消耗资源,解决办法避免多次去判断锁,只将问题代码包裹在同步代码块当中。

在使用锁的同时需要注意,如果是同步代码块,那么传入的只要是对象都可以,但是,如果是用同步函数就要注意了,用的锁就是this.class ,如果这个同步函数是静态的,那么这个锁就应该是 类名.Class。

 

死锁:就是访问锁的对象类型不匹配的同步代码块。这个时候可能就会出现死锁、程序将卡住。 经可能的避免死锁的发生。

 

 

锁(Lock):

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。以前的几种状态都封装在Condition 里面了。 灵活性提高了。

 

线程示范:

 

package com.fengfeng.ThreadDemo;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Son{
	public static void main(String[] args)
	{
		final Lock lock = new ReentrantLock();
		final Condition condition = lock.newCondition(); 
		
		new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				lock.lock();
				try {
					for (int i = 0; i < 50; i++) {
						if (i==18) {
							condition.await();
						}
						System.out.println("123123");
					}
				} catch (Exception e) {
					// TODO: handle exception
				}finally
				{
					lock.unlock();
				}
			}
		}.start();
	}
}


 

 

 

---------------------- android培训java培训、期待与您交流! ----------------------

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值