zoukankan      html  css  js  c++  java
  • 线程同步

    
    /*
    实现Runnable接口
    1、定义类实现Runnable接口
    2、重写Runnable接口中run方法
    3、通过Thread创建对象
    4、将Runnable接口的子对象作为参数传递给Thread类的构造函数,为什么呢?
    自定义的run方法时属于Runnable接口子类对象的,不是Thread类,所以不是线程,要让 线程对象去指定对象的run方法
    就必须明确该run方法所属对象。
    5、调用Thread类的start方法开启线程对象并调用Runnale接口子对象的run方法


    实现接口方式和继承累的区别?
    1、此时主要是java中类的但继承,接口可以实现多继承。避免了但继承的局限性。
    定义线程建议时用Runnable方式。


    线程执行的每一个时间片段都有可能被阻塞。
    当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行一部分,还没有执行完,另一个线程参与进来执行,导致共享数据出现错误。
    解决:
    对共享数据,只能让一个线程进行执行完,在执行另一个,执行过程中其他线程不可以参与执行。用同步代码块
    sychronized(对象)
    {
    需要被同步的代码块(操作共享数据的代码)
    }
    对象如同锁,持有锁的线程可以再同步中运行,没有持有锁的所有权的线程即使获得cpu,也进不去。因为没有获取锁


    同步的前提:
    1、必须有两个或两个以上的线程。
    2、必须是多个线程使用同一个锁
    好处:解决了线程同步安全问题
    弊端:多个线程需判断锁,耗费资源
    */
    class myThread implements Runnable
    {
    private int ticket = 100;
    Object obj = new Object();
    public void run()
    {
    while(true)
    {
    synchronized(obj)
    {
    if(this.ticket>0)
    {
    try
    {
    Thread.sleep(10);
    }
    catch (InterruptedException ex)
    {
    ex.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+"票号:"+ticket--);
    }
    }
    }
    }
    }
    class  RunnableTest
    {
    public static void main(String[] args) 
    {
    myThread mt = new myThread();
    Thread t = new Thread(mt);
    Thread t1 = new Thread(mt);
    t.start();
    t1.start();
    }
    }
  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/dengshiwei/p/4258548.html
Copyright © 2011-2022 走看看