作者BlackMatrix (BlackMatrix)
看板java
标题[问题] 关於Threading
时间Sun Mar 7 10:00:23 2010
最近教授正在教Threading, 班上的好像高中都已经学过了, 教授以超快速的速度带过
一大堆东西,还好我有一些比较可靠的书本可以帮我
可是有一点, Threading, 书本上教得很模糊
(Just Java 2 6e, Data Structures and Problem Solving Using Java 3e)
我不太确定我这样写的对不对, 以下是某些Code:
public class Main
{
public static void main(String[] args)
{
new ThreadDemo1().start();
System.out.println("Hello from Main!");
System.out.println("Program is now finished");
}
}
class ThreadDemo1 extends Thread
{
public void run()
{
try
{
sleep(500);
}
catch (InterruptedException ex)
{
Logger.getLogger(ThreadDemo1.class.getName()).log(Level.SEVERE,
null, ex);
}
System.out.println("ThreadDemo1 saying howdy!");
}
}
我有个问题就是说:
如果跑这个code, 会变成
Hello From Main
Program is now finsihed
ThreadDemo1 saying Howdy
会变成这样是因为Thread把Main跟ThreadDemo1各分成一个Thread,然後因为Main的Thread
先跑完,在跑ThreadDemo1的Thread才会这样吗?
另一个问题是, 如果我要找一个素数(Prime Number)
public class Main
{
public static void main(String[] args)
{
for (int i = 0; i<1000; i++)
{
new ThreadDemo2(i).start();
}
}
}
class ThreadDemo2 extends Thread
{
int number;
ThreadDemo2(int primeTest)
{
number = primeTest;
}
public void run()
{
boolean isPrime = true;
for (int i = 2; i <= Math.sqrt(number)&& isPrime; i++)
{
if (number%1 == 0)
{
isPrime=false;
}
}
if(isPrime)
{
System.out.println(number+ " is a prime");
}
}
}
如果利用这个Code跑的话, 他出来的数字都不是一个一个一个i=1,i=2,i=3下去
请问是因为Thread是分成i=1,i=2,i=3同时在跑的吗?
如果我有225个processes, 那一次性可以算225个prime number?
如果我用sleep(在Demo 1)用这样的写法呢?
最後一个大问题,
public class Main
{
public static void main(String[] args)
{
new ThreadDemo5(5).start();
new ThreadDemo6(6).start();
}
}
class Dummy
{
static Integer stuff = new Integer(0);
}
class Dummy2
{
static Integer stuff = new Integer(0);
}
class ThreadDemo5 extends Thread
{
int id;
ThreadDemo5(int n)
{
id = n;
}
public void run()
{
for (int i=0; i<500; i++)
{
synchronized (Dummy2.stuff)
{
yield();
synchronized (Dummy.stuff)
{
System.out.print(id);
}
}
}
}
}
class ThreadDemo6 extends Thread
{
int id;
ThreadDemo6(int n)
{
id = n;
}
public void run()
{
for (int i=0; i<500; i++)
{
synchronized (Dummy2.stuff)
{
yield();
synchronized (Dummy.stuff)
{
System.out.print(id);
}
}
}
}
}
Dummy的作用是...
synchronized的原意是要只让一个Thread跑的意思吗?
可是为什麽跑这段Code的时候会...
变成5555556666666555555666666, 不是应该是555555556666666吗?
yield的作用是把Thread暂停一下让其他Thread跑, 为什麽如果我把yield拿掉的话
结果都不是持续性的55555555666666666而是55665555566655555666段开的呢?
谢谢大家的帮忙
以下是Code:
http://nopaste.csie.org/670f3
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 173.56.121.140
※ 编辑: BlackMatrix 来自: 173.56.121.140 (03/07 10:03)
1F:推 DavyBlue:我只能说 不同thread没有用synchronized所起来的话 03/08 15:04
2F:→ DavyBlue:永远没有人知道哪一个thread会先跑 03/08 15:05
3F:→ BlackMatrix:不过我有把Synchronized拿掉可是结果还是差不多 03/09 04:47
4F:→ TonyQ:就算用 synchornized ,还是没办法保证哪一个Thread会先跑. 03/09 14:08
5F:→ BlackMatrix:原来如此,难怪我自己又做了一堆例题都没办法测谁先跑 03/10 09:33
6F:→ TonyQ:Synchronized 只能保证同一时间只有一个Thread存取. 03/10 10:58