黑马程序员技术交流社区
标题:
线程同步问题
[打印本页]
作者:
刘勇强
时间:
2013-3-7 16:26
标题:
线程同步问题
本帖最后由 刘勇强 于 2013-3-7 21:57 编辑
class MyThread implements java.lang.Runnable
{
private int threadId;
public MyThread(int id)
{
this.threadId = id;
}
public synchronized void run()
{
for (int i = 0; i < 100; ++i)
{
System.out.println("Thread ID: " + this.threadId + " : " + i);
}
}
}
public class ThreadDemo
{
public static void main(String[] args) throws InterruptedException
{
for (int i = 0; i < 10; ++i)
{
new Thread(new MyThread(i)).start();
Thread.sleep(1);
}
}
}
复制代码
在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,结果总不对
作者:
陈圳
时间:
2013-3-7 16:39
这你想达到什么效果,这不是十个单线程吗?不能理解你的互斥访问是什么意思.
你要理解多线程的概念,是多个线程共同操作一个任务,达到提高效率的方式...
作者:
范德农
时间:
2013-3-7 17:03
不是很明白你说的互斥访问是什么,但我想你说的应该就是两个以上线程不能同时访问一个资源,互相排斥访问吧,也就是我们常说的同步。
如果这样的话,你的问题就很好解决了,同步的前提是共用一个锁,而sychronized语句的锁是this,也就是调用语句本身所在对象,而你这里
的多个线程的锁都是一个新的MyThread对象,明显不满足共用锁的条件,另外不是很明白你写在第27行的Thread.sleep(1);的用意,放在这里
这句话发挥的作用是让主线程暂时休眠而不是任何新建线程,我想你的意思大概是想让一个子线程启动后,休眠下,看下一个新建的线程是否
作者:
谢洋
时间:
2013-3-7 17:12
你new了十个对象,每个对象都有一份属于自己的run()代码,它们相互独立的,这样子都各玩自已的那一分代码了,
作者:
范德农
时间:
2013-3-7 17:13
不是很明白你说的互斥访问是什么,但我想你说的应该就是两个以上线程不能同时访问一个资源,互相排斥访问吧,也就是我们常说的
同步
。
如果这样的话,你的问题就很好解决了,同步的前提是
共用一个锁
,而sychronized语句的锁是this,也就是调用语句本身所在对象,而你这里
的多个线程的锁都是一个新的MyThread对象,明显不满足共用锁的条件,另外不是很明白你写在第27行的Thread.sleep(1);的用意,放在这里
这句话发挥的作用是让主线程暂时休眠而不是任何新建线程,不过我想你的意思大概是想让一个子线程启动后,休眠下,看下一个新建的线程是
否还能再次访问共享资源吧。我把代码修改了下,应该能满足你的需要。
class MyThread implements java.lang.Runnable
{
public MyThread()
{
}
public synchronized void run() throws InterruptedException
{
for (int i = 0; i < 100; ++i)
{
//这么做是为了在输出时区分线程,当然,你也可以通过setName()来自命名
System.out.println(Thread.currentThread().getName() + " : " + i);
}
//在这里休眠,看新线程是否能访问共用资源
Thread.sleep(1);
}
}
public class ThreadDemo
{
public static void main(String[] args) throws InterruptedException
{
//建立共用锁
MyThread a = new MyThread();
for (int i = 0; i < 10; ++i)
{
new Thread(a).start();
}
}
}
复制代码
希望我的回答能帮助你。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2