------- 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()临时释放,可以使程序交替执行。。