黑马程序员 多线程总结2

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

一、多线程:
程序的多条执行路径。
二、如何实现多线程?
A:继承Thread类
B:实现Runnable接口
三、如何启动线程:
调用start方法。
四、线程生命周期:
A:新建 start()到就绪
B:就绪 有执行资格但是没有执行权     run()到运行    
C:运行 有执行资格也有执行权 run()结束到死亡   或者Stop()到死亡       sleep()到冻结    waite()到冻结
D:阻塞,冻结   没有执行资格也没有执行权 sleep()醒了到就绪notify()到就绪
E:死亡 对象消失了
五、线程安全问题的产生:
A:有共享数据
B:共享数据被多条语句操作
C:多个线程访问共享数据

public class Input implements Runnable {  
  
    private Person p;  
  
    // private Object obj = new Object();  
  
    public Input(Person p) {  
        this.p = p;  
    }  
  
    @Override  
    public void run() {  
        int x = 0;  
        while (true) {  
            synchronized (p) {  
                if (x % 2 == 0) {  
                    p.name = "林青霞";  
                    p.age = 25;  
                } else {  
                    p.name = "刘意"; // output抢到了。p.name="刘意" p.age=25;  
                    p.age = 28;  
                }  
            }  
            x++;  
        }  
    }  
}  
public class Output implements Runnable {  
  
    private Person p;  
  
//  private Object obj = new Object();  
  
    public Output(Person p) {  
        this.p = p;  
    }  
  
    @Override  
    public void run() {  
        while (true) {  
            synchronized (p) {  
                System.out.println(p.name + "***" + p.age);  
            }  
        }  
    }  
  
}  

public class PersonTest {  
    public static void main(String[] args) {  
        // 创建资源  
        Person p = new Person();  
  
        Input in = new Input(p);  
        Output out = new Output(p);  
  
        Thread t1 = new Thread(in);  
        Thread t2 = new Thread(out);  
  
        t1.start();  
        t2.start();  
    }  
}  
六、如何解决线程安全问题:同步
A:同步代码块
B:同步方法
七、死锁(面试)

//开发不可能,面试常问  
/* 
  死锁实例 
   造2把锁 A B  
   
  产生了同步嵌套 
*/  
class Dead implements Runnable  
{  
    boolean b = false;  
    public void run()  
    {  
       while(true)  
        {  
            if(b)  
            {  
               synchronized(LockA.locka)//2 locka  
                {  
                   System.out.println("if...locka");//2 locka  
                     synchronized(LockB.lockb)  
                    {  
                      System.out.println("if...lockb");   
                    }  
                }  
            }  
            else  
            {  
               synchronized(LockB.lockb)//1 lockb  
                {  
                  System.out.println("else...lockb");// lockb  
                   synchronized(LockA.locka)  
                    {  
                      System.out.println("else...locka");  
                    }  
                }  
            }  
           
        }  
    }  
}  
  
class LockA  
{  
    public static LockA locka = new LockA();  
}  
class LockB  
{  
    public static LockB lockb = new LockB();  
}  
class DeadLock   
{  
    public static void main(String[] args)   
    {  
        Dead d1 = new Dead();//false  
        Thread t1= new Thread(d1);  
  
        Dead d2 = new Dead();//true  
        d2.b=true;  
        Thread t2 =new Thread(d2);  
  
        t1.start();  
        t2.start();  
    }  
}  

八、线程间的通信(理解)
九、方法:
线程优先级   public final int getPriority()   返回线程的优先级
  public final void setPriority(int newPriority)       设置优先级 范围是1到10
加入线程   public final void join()    等待该线程终止
其他的线程需要等待该线程结束才能运行
守护线程     public final void setDaemon(boolean on)     将该线程标记为守护线程或用户线程
当其标记线程结束的时候,其他的线程也跟着结束
暂停线程     public static void yield()
线程的名称设置和获取
public final String getName()    返回线程的名称
public final void setName(String name)   设置线程的名称


---------------- ASP.Net+Unity开发.Net培训、期待与您交流! ---------------------- 详细请查看:www.itheima.com

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值