设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。public class ThreadTest1{    
private int j;    
public static void main(String args[]){    
ThreadTest1 tt=new ThreadTest1();  
Inc inc=tt.new Inc();     //??? 为什么可以写成tt.new 这样子的呢,看不懂,涉及哪方面的知识呢;
Dec dec=tt.new Dec();    
for(int i=0;i<2;i++){    
Thread t=new Thread(inc);    
t.start();    
t=new Thread(dec);   //???这个前面不要加Thread吗 
t.start();    
}    
}    
private synchronized void inc(){  //???为什么要加锁呢 不加可以吗  
j++;    
System.out.println(Thread.currentThread().getName()+"-inc:"+j);    
}                       //???currentThread()有什么作用呢是什么方法
                            //???getname呢
private synchronized void dec(){    
j--;    
System.out.println(Thread.currentThread().getName()+"-dec:"+j);    
}    
class Inc implements Runnable{    
public void run(){    
for(int i=0;i<100;i++){    
inc();    
}    
}    
}    
class Dec implements Runnable{    
public void run(){    
for(int i=0;i<100;i++){    
dec();    
}    
}    
}    
}     

解决方案 »

  1.   

     //???   为什么可以写成tt.new   这样子的呢,看不懂,涉及哪方面的知识呢; 
    这是实例化一个内部类对象。
    //???为什么要加锁呢   不加可以吗     
    加锁保护数据在被一个线程访问期间不能被其它线程序访问!你上厕所的时候当然要把门锁好,要不妇女闯进来不坏事了?你完事后再打开门,让别人来用,一样的道理!呵呵~~~
    //???currentThread()有什么作用呢是什么方法 //???getname呢 
    currentThread方法获得当前在运行的线程,getname获得当前线程的名字!(多看API文档)
    你的代码有点乱,不知是不是我理解能力有问题!
    我试着写了一段,不知各符合主考官的本意!class MyThreadTest
    {
    int i=0,cnt=0;
    public static void main(String[] args)
    {
    MyThreadTest mt=new MyThreadTest();
    ThreadPlus t1=mt.new ThreadPlus("Thread1");
    ThreadPlus t2=mt.new ThreadPlus("Thread2");
    ThreadMinus t3=mt.new ThreadMinus("Thread3");
    ThreadMinus t4=mt.new ThreadMinus("Thread4");
    t1.start();
    t2.start();
    t3.start();
    t4.start();


    }

    class ThreadPlus extends Thread
    {
    ThreadPlus(String str)
    {
    super(str);
    }
    public void run()
    {
    while(true){
    PMOne(true);
    yield();
    }
    }
    }
    class ThreadMinus extends Thread
    {
    ThreadMinus(String str)
    {
    super(str);
    }
    public void run()
    {
    while(true){
    PMOne(false);
    yield();
    }
    }
    }
    public synchronized void PMOne(boolean PorM)
    {
    if(PorM==true)
    {
    i++;
    }
    else
    {
    i--;
    }
    System.out.println(Thread.currentThread().getName()+":"+i);
    if(cnt++==1000) System.exit(0);
    }
    }其实这段代码俺也不是很满意的,有wait()notify()方法可以等待和唤醒线程,可俺不太知道用了,只在双线程中用过!
      

  2.   

    楼住是抄的java面试题中的解答.楼上解答的是对的.
    都是书上的东西.
      

  3.   

    找到个屁,老子还在讨米ing...
    俺接触java也才一个月多,不过以前学过c、vb.net,现在java对俺来讲,不敢说是游刃有余,但一些概念不用看就知道,容易得很!
    在广州的朋友,推荐哈哪有工作找找哩?楼主不赖啊,给俺加了分哈,要知道要昨晚熬了多久…………
    唉,习惯了~~~