当前位置:  技术问答>java相关

初涉Java多线程,想请教各位一个有关synchronized代码块的问题!

    来源: 互联网  发布时间:2017-04-07

    本文导语:  各位网友,大家好: 我初涉Java多线程,有一个问题不解,想请教一下各位高人,问题是这样的: synchronized方法我已经知道了,意思是说只有一个关键字为synchronized的方法能获得这个方法的类实例的锁,可以执行。其...

各位网友,大家好:
我初涉Java多线程,有一个问题不解,想请教一下各位高人,问题是这样的:
synchronized方法我已经知道了,意思是说只有一个关键字为synchronized的方法能获得这个方法的类实例的锁,可以执行。其他想获得这个方法的类实例的锁只有等待。直到这个方法返回释放这个锁为止。而还有一个synchornized块,虽然它的机制和synchronized方法差不多,但是synchronized块后面要跟一个对
象,这个对象可以是类或类实例,可是我想问的是,如果判断这个对象到底是那个具体对象呢?我在有些程序中看到有时候是这个线程本身的实例,有时候是这个线程的实现Runnable的目标对象的实例,这到底是根据什么来判断的呢?是根据这个synchronized块中的某些代码来判断的吗?谢谢各位高人能帮我解这个惑?最好能举些具体的代码实例来帮助理解!谢谢各位了!

|
import java.awt.*;
import java.applet.Applet;

class BounceThread extends Thread {
    private int incr = 10;
    private int yDir = 1;
    private int xDir = 1;
    private int sleepFor = 100;
    UsingWaitNotify applet;
    public BounceThread(UsingWaitNotify applet) {
        this.applet = applet;
    }
    public void run() {
        Thread curThread = Thread.currentThread();
        while (true) {
            synchronized (this) {
                if (applet.threadSuspended || curThread != applet.bounceThread) {
                    System.out.println(System.currentTimeMillis() / 1000);
                    try {
                    curThread.wait();
                    } catch (InterruptedException e) {
                    e.printStackTrace();
                    }
                    System.out.println(System.currentTimeMillis() / 1000);
                }
            }
            applet.y += (incr * yDir);
            applet.x += (incr * xDir);
            applet.repaint();
            if (applet.y - applet.radius = applet.getSize().height)
                yDir = -1;
            if (applet.x - applet.radius = applet.getSize().width)
                xDir = -1;
            try {
                sleep(sleepFor);
            } catch (InterruptedException e) {
            e.printStackTrace();
            }
        }
    }
}

public class UsingWaitNotify extends Applet {
    public static int radius = 20;
    public static int x = 30;
    public static int y = 30;
    Thread bounceThread;
    public volatile boolean threadSuspended;
    public void destroy() {
    System.out.println("destroy.");
        synchronized (bounceThread) {
            Thread t = bounceThread;
            bounceThread = null;
            t.notify();
        }
    }
    public void init() {
    System.out.println("init.");
        bounceThread = new BounceThread(this);
        threadSuspended = true;
        bounceThread.start();
    }
    public void paint(Graphics g) {
        g.setColor(Color.blue);
        g.drawOval(x - radius, y - radius, 2 * radius, 2 * radius);
    }
    public void start() {
    System.out.println("start.");
        synchronized (bounceThread) {
            threadSuspended = false;
            bounceThread.notify();
        }
    }
    public void stop() {
    System.out.println("stop.");
        threadSuspended = true;
    }
}
/*


UsingWaitNotify


UsingWaitNotify


Source code for UsingWaitNotify






*/


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 初涉linux,各位多关照!
  • 初涉Linux,有事请教!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3