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();
    }
    }
  • 相关阅读:
    判断具有某个属性js、jQuery
    新建maven项目,JRE System Library[J2SE-1.5]
    maven多模块搭建
    The POM for * is invalid
    【react】react-bookManager
    【cml】wosi-demo
    关于白盒测试
    【weex】h5weex-example
    【weex】publishTask
    Eslint报错的翻译
  • 原文地址:https://www.cnblogs.com/dengshiwei/p/4258548.html
Copyright © 2011-2022 走看看