黑马程序员_java入门_多线程

本文详细介绍了Java中多线程的基础概念与实现方法,包括进程与线程的区别、多线程的创建方式、同步机制、等待与唤醒机制、单例模式、死锁问题及其解决方法等,并探讨了线程安全、优先级设置及守护线程的应用。
 


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

一概念

进程:一个正在的执行的程序

线程:一个程序进程中的控制单元

一个进程至少有一个线程。

 

二,多线程

1.定义一个类,继承Thread

2.复写里面的run()方法

3.建立对象后用start()方法运行

 

start方法的两个作用

1.启动线程

2.运行run()方法

 

sleep()和wait()的区别

sleep()是一种临时阻塞,里面填上时间后,时间结束就能再次启动,同时判断有没有执行权

wait(()是一种唤醒机制,需要使用一个notify再能叫醒,不具有定时性

 

三。获取多线程的名称

Thread.currentThread()//返回一个对象 类名。方法名 因为静态的可以直接调用

获取线程名称

Thread.currentThread().getName()

 

 

四.实现多线程的第二种方法

1.定义类实现Runnable接口

2.复习Runnable方法里面的run()方法

3.通过Thread类建立线程对象

4.将Runnable接口的子对象作为实际参数传递给Thread类的构造函数

5.建立了一个Thread类

6.调用start()方法开启线程

 

实现方式和继承方式的区别

实现方式避免了单继承的局限性,建议使用实现方式

 

1.一个继承

2.一个实现

 

五.多线程的安全问题

问题:一个线程还没执行完,另一线程有参与了进来,导致属于错乱

 

解决办法,加一个锁,防止后面进程进来

 

同步代码块

synchronized(对象)

{

需要被同步的代码

}

 

六.同步代码块

同步的前提

1.必须有两个或两个以上的线程

2.必须是多个线程使用同一个所

 

好处:1.解决了安全问题

弊端:消耗了锁的资源

 

同步函数用的锁一般是this锁,this.class是一个字节码文件,也是一个对象,就是建立对象后的this

 

 

静态同步函数

 

如果一个函数被静态后,那么他的锁不是this锁了,而是类名.class锁

 

七单例设计模式---懒汉式

class SingleDemo

{

     private static SingleDemo s=null;

     private SingelDemo(){}

     public static SingleDemo getSingle(){

     if(s==null){

         suychronized(SingelDemo.class)

           {

           if(s==null)

          {

               s=new SingleDemo();

          }

         }

     return s;

}

}

 

 

八。死锁

锁的互相调用,容易导致死锁,经量避免

 

 

九.多线程的等待唤醒机制

wait()

notify()

notifyAll()

 

用了什么锁,就要用什么锁来唤醒

r.notify();

 

 

 

}

十。jdk新特性

Lock unLock
class Resource//多个生产者 多个消费者
{
	privater String name;
	private int count=1;
	private boolean flag=false;
	private Lock lock=new RenntrantLock();
	private Condition condition_pro=lock.newCondition();
	private Condition condition_con=lock.newCondition();
	public void set(String name) throws InterruptedException
	{
			lock.lock();//锁中有标记,一个锁多个condition
			try{
				while(flag)
					condition_pro.await();//抛异常。没处理。声明出去
				this.name=name+"---"+count++;
				sop(Thread.currenThread().getNname()+"生产者"+this.name);
				flag=true;
					condition_con.signal();
			}
			finnaly
			{
				lock.unlock();
			}
	}
	public  void out() throws InterruptedException
	{
	```	lock.lock();
		try{
			while(!flag)
				condition_con.await();
				sop("消费者");
				flag=false;
				condition_pro.signal();
		}
		finnally
		{
			lock.unlock();
		}
	}
}
class Producer implements Runnable
{
	private Resource res;
	Produce(Resource res)
	{
		this.res=res;
	} 
	public void run()
	{
		while(true)
		{
			try
			{
				res.set("商品");
			}
			catch(InterruptedException e)
			{
			}
		}
	}

}
class Comsumer implements Runnable
{
	private Resource res;
	Comsumer(Resource res)
	{
		this.res=res;
	} 
	public void run()
	{
		while(true)
		{
			
		try
			{
				res.out();
			}
			catch(InterruptedException e)
			{
			}
		}
	}

}
class Demo
{
	public static void main(String[] args)
	{
		Resource r=new Resource;
		Producer P=new Producer(r);
		Comsumer c=new Comsumer(r);
		p.start();
		c.start();
	}

}

十一.停止线程

线程.interruput()

 

十二、守护线程

t1.setDemo(true);

 

主线程一结束,后面的线程自动结束(指的是守护线程)

join()抢夺主线程执行权

,等待抢劫者执行完,主线程才执行

 

十三线程的优先级

t1.setPriority(Thread.MAX_PRIORITY)

线程的优先执行

Thread.yield()临时释放,可以使程序交替执行。。

 

 

 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值