黑马程序员 多线程总结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
    评论
黑马程序员多线程练习题主要包括两个问题。第一个问题是如何控制四个线程在打印log之前能够同时开始等待1秒钟。一种解决思路是在线程的run方法中调用parseLog方法,并使用Thread.sleep方法让线程等待1秒钟。另一种解决思路是使用线程池,将线程数量固定为4个,并将每个调用parseLog方法的语句封装为一个Runnable对象,然后提交到线程池中。这样可以实现一秒钟打印4行日志,4秒钟打印16条日志的需求。 第二个问题是如何修改代码,使得几个线程调用TestDo.doSome(key, value)方法时,如果传递进去的key相等(equals比较为true),则这几个线程应互斥排队输出结果。一种解决方法是使用synchronized关键字来实现线程的互斥排队输出。通过给TestDo.doSome方法添加synchronized关键字,可以确保同一时间只有一个线程能够执行该方法,从而实现线程的互斥输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [黑马程序员——多线程10:多线程相关练习](https://blog.csdn.net/axr1985lazy/article/details/48186039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值