java多线程问题。两个线程交替打印。例如第一个线程打印1,接着第二个线程打印100,接着第一个线程打印2。
publicclassThreadTest1extendsThread{privatestaticintnum=0,n=100;staticThreadTest1t1,t...
public class ThreadTest1 extends Thread {
private static int num=0,n=100;
static ThreadTest1 t1,t2;
int i=0;
static int x;
static String ss=new String();
public ThreadTest1()
{
start();
}
public void run() {
for(x=0;x<200;x++)
{
synchronized(ss)
{
此处添加代码
}
}
}
public synchronized void Print()
{
if(i==0)
{
i++;
System.out.println(this.getName()+":"+ ++num);
}
else
{
i=(i+1)%2;
System.out.println(this.getName()+":"+ ++n);
}
}
public static void main(String[] args) throws InterruptedException {
t1=new ThreadTest1();
t2=new ThreadTest1();
}
}
我的想法是在for循环里面每个线程交替调用Print(),但写出来老是不行。求高手。。 展开
private static int num=0,n=100;
static ThreadTest1 t1,t2;
int i=0;
static int x;
static String ss=new String();
public ThreadTest1()
{
start();
}
public void run() {
for(x=0;x<200;x++)
{
synchronized(ss)
{
此处添加代码
}
}
}
public synchronized void Print()
{
if(i==0)
{
i++;
System.out.println(this.getName()+":"+ ++num);
}
else
{
i=(i+1)%2;
System.out.println(this.getName()+":"+ ++n);
}
}
public static void main(String[] args) throws InterruptedException {
t1=new ThreadTest1();
t2=new ThreadTest1();
}
}
我的想法是在for循环里面每个线程交替调用Print(),但写出来老是不行。求高手。。 展开
2011-09-15
展开全部
你这样写两个线程实例t1和t2间没有交互通信,各跑各的,当然不会达到你上面说的那个结果。要想达到你上面说的那个效果,必须进行线程间通信。比如,你可以让两个线程实例都对方的引用,在run函数里执行打印的方法后,就让t2跑,t1去睡觉(sleep())。等t2打印完后,又让t1跑,让t2去睡觉,这样即可。 给你思路,代码我就不写了。
追问
我也知道要通信。。关键是怎样实现啊。。t1睡觉。。也不知道t2会打印几个。这样就不是交替打印了。。
展开全部
帮你改了改,测试可行
public class ThreadTest1 extends Thread {
private static int num = 0, n = 100;
static ThreadTest1 t1, t2;
static int i = 0;
static int x;
static String ss = new String();
public ThreadTest1() {
start();
}
public void run() {
for (x = 0; x < 200; x++) {
synchronized (ss) {
ss.notify();
Print();
try {
ss.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
synchronized (ss) {
ss.notifyAll();
}
}
public void Print() {
if (i == 0) {
i++;
System.out.println(this.getName() + ":" + ++num);
} else {
i = (i + 1) % 2;
System.out.println(this.getName() + ":" + n++);
}
}
public static void main(String[] args) throws InterruptedException {
t1 = new ThreadTest1();
t2 = new ThreadTest1();
}
}
public class ThreadTest1 extends Thread {
private static int num = 0, n = 100;
static ThreadTest1 t1, t2;
static int i = 0;
static int x;
static String ss = new String();
public ThreadTest1() {
start();
}
public void run() {
for (x = 0; x < 200; x++) {
synchronized (ss) {
ss.notify();
Print();
try {
ss.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
synchronized (ss) {
ss.notifyAll();
}
}
public void Print() {
if (i == 0) {
i++;
System.out.println(this.getName() + ":" + ++num);
} else {
i = (i + 1) % 2;
System.out.println(this.getName() + ":" + n++);
}
}
public static void main(String[] args) throws InterruptedException {
t1 = new ThreadTest1();
t2 = new ThreadTest1();
}
}
追问
嗯。。结果还可以。。要是注释下就好了。。还有就是第一个线程从1打印到100..第二个线程从101打印到200就更好了。。要是能写出来。。再给你加20分。。虽然我用另外的方法写出来两个。。但这是我想的最久的。。希望有人帮我写出来。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用个对象锁,获得对象锁的线程打印就行了。
追问
synchronized(ss)
这个不是对象锁吗???
追答
你这个锁没什么用,打印完后线程就释放了,其他线程或本线程就抢着打印。
算法:抢到锁的线程sleep。等待其他线程唤醒。只有获得锁的线程才打印。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询