代码如下,运行正常,共3个thread,每个thread操作money3次后才允许下一个thread操作money变量,
但是奇怪的是,如果把Setmoney()中被注释掉的那几行代码加上[也就是加了个sleep()功能],结果就有问题了,是3个thread交替去操作money变量,没有达到线程同步的效果!咋回事儿ni???//
// DEMO:
//
public class ThreadSync implements Runnable
{
String ThreadName = "abc";
int SleepTime;
int UseMoney;
static int Money=0;
public ThreadSync(String str, int v_time, int v_money)
{
ThreadName = str;
SleepTime = v_time;
UseMoney = v_money;
System.out.println(ThreadName + " Created !");
}
public void run()
{
System.out.println("Thread: " + ThreadName + " Begin...");
SetMoney(UseMoney);
System.out.println("Thread: " + ThreadName + " End...");
}
public synchronized void SetMoney(int tmp)
{
// try
// {
for(int c = 1 ;c <= 5 ; c++)
{
Money += tmp;
System.out.println(ThreadName + " -- " + c + "==" + Money);
// Thread.sleep(SleepTime);
}
// }
// catch(InterruptedException e)
// {
// //return;
// }
}
public static void main(String argv[])
{
ThreadSync tmp;
Thread T;
tmp = new ThreadSync("001", 400, 2); //thread名称,sleep时间,每次操作金额
T = new Thread(tmp);
T.setPriority(4);
T.start();
tmp = new ThreadSync("002", 600, 4);
T = new Thread(tmp);
T.setPriority(6);
T.start();
tmp = new ThreadSync("003", 800, -3);
T = new Thread(tmp);
T.setPriority(8);
T.start();
for(int i = 1; i <= 10; i++)
{
try
{
if( Thread.activeCount()<=1)
break;
//System.out.println("Active Threads: " + Thread.activeCount());
Thread.sleep(500);
}
catch(InterruptedException e)
{
System.out.println("Error Happened !");
}
}
System.out.println("ThreadMain End !"); //another begin thread method
//new Thread(new Thread02("001", 400)).start();
//new Thread(new Thread02("002", 600)).start();
//new Thread(new Thread02("003", 800)).start();
}
}
但是奇怪的是,如果把Setmoney()中被注释掉的那几行代码加上[也就是加了个sleep()功能],结果就有问题了,是3个thread交替去操作money变量,没有达到线程同步的效果!咋回事儿ni???//
// DEMO:
//
public class ThreadSync implements Runnable
{
String ThreadName = "abc";
int SleepTime;
int UseMoney;
static int Money=0;
public ThreadSync(String str, int v_time, int v_money)
{
ThreadName = str;
SleepTime = v_time;
UseMoney = v_money;
System.out.println(ThreadName + " Created !");
}
public void run()
{
System.out.println("Thread: " + ThreadName + " Begin...");
SetMoney(UseMoney);
System.out.println("Thread: " + ThreadName + " End...");
}
public synchronized void SetMoney(int tmp)
{
// try
// {
for(int c = 1 ;c <= 5 ; c++)
{
Money += tmp;
System.out.println(ThreadName + " -- " + c + "==" + Money);
// Thread.sleep(SleepTime);
}
// }
// catch(InterruptedException e)
// {
// //return;
// }
}
public static void main(String argv[])
{
ThreadSync tmp;
Thread T;
tmp = new ThreadSync("001", 400, 2); //thread名称,sleep时间,每次操作金额
T = new Thread(tmp);
T.setPriority(4);
T.start();
tmp = new ThreadSync("002", 600, 4);
T = new Thread(tmp);
T.setPriority(6);
T.start();
tmp = new ThreadSync("003", 800, -3);
T = new Thread(tmp);
T.setPriority(8);
T.start();
for(int i = 1; i <= 10; i++)
{
try
{
if( Thread.activeCount()<=1)
break;
//System.out.println("Active Threads: " + Thread.activeCount());
Thread.sleep(500);
}
catch(InterruptedException e)
{
System.out.println("Error Happened !");
}
}
System.out.println("ThreadMain End !"); //another begin thread method
//new Thread(new Thread02("001", 400)).start();
//new Thread(new Thread02("002", 600)).start();
//new Thread(new Thread02("003", 800)).start();
}
}
{
System.out.println("Thread: " + ThreadName + " Begin...");
SetMoney(UseMoney);
System.out.println("Thread: " + ThreadName + " End...");
}
SetMoney(UseMoney);原语
System.out.println("Thread: " + ThreadName + " End...");
System.out.println("Thread: " + ThreadName + " Begin...");
这两个不是啊,
因为public synchronized void SetMoney中synchronized是对this同步,但你看
tmp = new ThreadSync("001", 400, 2);
tmp = new ThreadSync("002", 600, 4);
tmp = new ThreadSync("003", 800, -3);
有3个this啊,
也是初学者,等高手
// DEMO:
//
public class ThreadSync implements Runnable
{
String ThreadName = "abc";
int SleepTime;
int UseMoney;
static int Money=0;
static String qq="a";
public ThreadSync(String str, int v_time, int v_money)
{
ThreadName = str;
SleepTime = v_time;
UseMoney = v_money;
System.out.println(ThreadName + " Created !");
}
public void run()
{
synchronized(qq){
System.out.println("Thread: " + ThreadName + " Begin...");
SetMoney(UseMoney);
System.out.println("Thread: " + ThreadName + " End...");
}
}
public void SetMoney(int tmp)
{
try
{
for(int c = 1 ;c <= 5 ; c++)
{
Money += tmp;
System.out.println(ThreadName + " -- " + c + "==" + Money);
Thread.sleep(SleepTime);
}
}
catch(InterruptedException e)
{
}
}
public static void main(String argv[])
{
ThreadSync tmp;
Thread T;
tmp = new ThreadSync("001", 400, 2); //thread名称,sleep时 间,每次操作金额
T = new Thread(tmp);
T.start();
tmp = new ThreadSync("002", 600, 4);
T = new Thread(tmp);
T.start();
tmp = new ThreadSync("003", 800, -3);
T = new Thread(tmp);
T.start();
}
}