当前位置: 技术问答>java相关
初涉Java多线程,想请教各位一个有关synchronized代码块的问题!
来源: 互联网 发布时间:2017-04-07
本文导语: 各位网友,大家好: 我初涉Java多线程,有一个问题不解,想请教一下各位高人,问题是这样的: synchronized方法我已经知道了,意思是说只有一个关键字为synchronized的方法能获得这个方法的类实例的锁,可以执行。其...
各位网友,大家好:
我初涉Java多线程,有一个问题不解,想请教一下各位高人,问题是这样的:
synchronized方法我已经知道了,意思是说只有一个关键字为synchronized的方法能获得这个方法的类实例的锁,可以执行。其他想获得这个方法的类实例的锁只有等待。直到这个方法返回释放这个锁为止。而还有一个synchornized块,虽然它的机制和synchronized方法差不多,但是synchronized块后面要跟一个对
象,这个对象可以是类或类实例,可是我想问的是,如果判断这个对象到底是那个具体对象呢?我在有些程序中看到有时候是这个线程本身的实例,有时候是这个线程的实现Runnable的目标对象的实例,这到底是根据什么来判断的呢?是根据这个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
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。