JAVA新手
只会实现简单的多线程程序
但是现在我想起五个线程
每个线程分别执行不同的函数
这五个函数之间没有交叉影响
请问如何实现?

解决方案 »

  1.   

    没有交叉、没有共享资源么?
    如果都没有,那就建立5个,然后一起run吧 奇怪的需求。
      

  2.   


    public class   helloworld
    {
    public static void main(String[] args) 
    {
    helloworld hw = new helloworld();
    hw.xx();
    }
    public void xx(){
    new Thread(new tt()).start();
    }
    private class tt implements Runnable{
    public void run() {
    r1();
    r2();
    r3();
    r4();
    r5();
    }
    }
    public void r1(){
    System.out.println("r1");
    }
    public void r2(){
    System.out.println("r2");
    }
    public void r3(){
    System.out.println("r3");
    }
    public void r4(){
    System.out.println("r4");
    }
    public void r5(){
    System.out.println("r5");
    }

    }是这样吗?
      

  3.   

    6楼那5个函数还是同步执行,分别针对5个函数进行5个线程的run,针对5个函数中有共同访问的资源上锁即可。
      

  4.   


    import java.awt.*;
    import java.awt.geom.*;
    import javax.swing.*;
    /**
     * 
     * @author East(张栋芳)
     *
     * 2008-6-8
     */
    public class PenguinTest extends JPanel implements Runnable{
    /**线程penguinRunner: 控制企鹅动画
     * 线程leaveRunner: 控制枫叶动画
     * 线程startRunner: 拉开序幕,显示画面
     * 线程ndRunner: 落下序幕
     * 线程DownRunner:用于控制何时落下序幕
     *
     * penguinImage[]数组用于存储构成企鹅动画的各帧图像
     * leave: 代表枫叶图像
     * current: 企鹅动画当前帧的索引
     * x, y :企鹅图像的起始横,纵坐标
     * z: 枫叶图像的起始横坐标
     * w, v : 左右子序幕的宽度
     */
     private Thread penguinRunner,
                    leaveRunner,
                    startRunner,
                    endRunner,
                    DownRunner;
     private Image penguinImage[],leave;
     private int current=0,x=-10,y=200,z=600,w=300,v=300;
                    
    public PenguinTest(){
    super();
    setBackground(Color.black);
    //加载构成企鹅动画的各帧图像
    penguinImage=new Image[3];
    String imgSrc[]={"image/right1.gif","image/right2.gif","image/right3.gif"};
    //实现图像缓冲
    MediaTracker track=new MediaTracker(this);
    Toolkit kit=Toolkit.getDefaultToolkit();
    for(int i=0;i<imgSrc.length;i++){
    penguinImage[i]=kit.getImage(imgSrc[i]);
    track.addImage(penguinImage[i],i);
    }
    //加载枫叶图像
    leave=kit.getImage("image/change.gif");
    track.addImage(leave,3);
    try{
    track.waitForAll();
    }catch(Exception e){
    e.printStackTrace();
    }
    //拉开序幕
    if(startRunner==null){
    startRunner=new Thread(this);
    startRunner.start();
    }
    //启动线程DownRunner,用于监控何时启动线程runner3落下序幕
            if(DownRunner==null) 
            {
                DownRunner=new Thread(this);
                DownRunner.start();
            }

    }
    //绘制动画
    public void paintComponent(Graphics comp){
    Graphics2D comp2D=(Graphics2D)comp;
    comp2D.setColor(getBackground());
    comp2D.fillRect(0,0,getSize().width,getSize().height);
    ////绘制枫叶
    if(leaveRunner!=null){
    if(leave!=null){
    comp2D.drawImage(leave,10+z,20,this);
    }
    }
    if(penguinRunner!=null){
      //绘制太阳,太阳运行轨迹为抛物线
      comp2D.setColor(Color.green);
      double temp=0.001211*(-30+x-300)*(-30+x-300);
      int temp1=(int)temp;
      comp2D.fillOval(-30+x,temp1,60,60);
      
      //绘制企鹅
      if(penguinImage[current]!=null)
          comp2D.drawImage(penguinImage[current],x,y,this);
      //绘制企鹅过河时所用的划板
      comp2D.setColor(Color.red);
      comp2D.drawLine(x-20,y+30,x+50,y+30);
      //绘制左右码头
      comp2D.setColor(Color.cyan);
      comp2D.fillRect(0,230,130,70);
      comp2D.fillRect(470,230,130,70);
      //绘制河水波纹
      comp2D.setColor(Color.red);
       BasicStroke pen=new BasicStroke(2F,BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND);
       for(int ax=130;ax<470;ax+=10){
         for(int ay=250;ay<300;ay+=10){
          Arc2D.Float wave=new Arc2D.Float(ax,ay,10,10,0,-180,Arc2D.OPEN);
            comp2D.draw(wave);
         }
       
       }
    }
    //绘制序幕(拉开)
    if(startRunner!=null){
    comp2D.setColor(Color.blue);
    comp2D.fillRect(0,0,w,600);
    comp2D.setColor(Color.yellow);
    comp2D.fillRect(v,0,600-v,600);
    }
    //绘制序幕(落下)
    if(endRunner!=null){
    comp2D.setColor(Color.blue);
    comp2D.fillRect(0,0,w,600);
    comp2D.setColor(Color.yellow);
    comp2D.fillRect(v,0,600-v,600);
    }
    }
    public void run(){
      //绘制企鹅
      while(Thread.currentThread()==penguinRunner){
       walk(-10,150);
       jump();
       walk(x,640);
      }
      //绘制枫叶
      while(Thread.currentThread()==leaveRunner){
       z=z-1;
       if(z<-150)
         z=600;
         repaint();
         pause(30);
      }
      //拉开序幕
      while(Thread.currentThread()==startRunner){
       if(w>-15)
          w--;
        if(v<615)
          v++;
          
         repaint();
         pause(50);
         //已经拉开序幕, 动画开始: 企鹅开始从左到右行走,枫叶开始从右到左移动
        if((w<-10)&&(v>610)){
         penguinRunner=new Thread(this);
         leaveRunner=new Thread(this);
         penguinRunner.start();
         leaveRunner.start();
         startRunner=null;
        }
      }
      
      // //落下序幕
      while(Thread.currentThread()==endRunner){
       if(w<300)
       w++;
       if(v>300)
        v--;
        repaint();
        pause(50);
      }
       //确定何时应该落下序幕
               while(Thread.currentThread()==DownRunner) 
               {
                   pause(100000);
                   penguinRunner=null;
                   leaveRunner=null;
                   startRunner=null;
                   endRunner=new Thread(this);
                   endRunner.start();
                   DownRunner=null;
               }  
    }
    //控制企鹅水平行走轨迹
     private void walk(int start,int end){
      int show=0;
      for(int i=start;i<end;i=i+5){
      x=i;
      current=show;
      repaint();
      pause(150);
      show++;
      if(show>2)
         show=0;
      }
     }
     private void jump(){
      int moveX=2;
      int moveY=-3;
      current=2;
      while(true){
      x+=moveX;
      y+=moveY;
      if(y<100){
      moveY*=-1;
      continue;
      }
      if(y>200){
      moveY*=-1;
      continue;
      }
      if(x>420)
               break;
              repaint();
              pause(150);
      }
     }
      //设置线程休眠时间
        private void pause(int time) 
        {
            try 
            {
                Thread.sleep(time);
            } catch (InterruptedException e) { }
        }

    }
      

  5.   

    import java.lang.Thread;class ThreadDemo 
    {
    public static void main(String[] args) 
    {
    ThreadTest t = new ThreadTest();
    new Thread(t,"t1").start
                    new Thread(t,"t2").start();//
    new Thread(t,"t3").start();//
    new Thread(t,"t4").start();//
                    new Thread(t,"t5").start();//

    }
    }class ThreadTest implements Runnable
    { public void run()
    {
    if(Thread.currentThread().getName().compareTo("t1") == 0)
    sale1();                if(Thread.currentThread().getName().compareTo("t1") == 1)
    sale2();
                    if(Thread.currentThread().getName().compareTo("t1") == 2)
    sale3();
                    if(Thread.currentThread().getName().compareTo("t1") == 3)
    sale4();
                    if(Thread.currentThread().getName().compareTo("t1") == 4)
    sale5(); } public void sale1()
    {
                System.out.println(Thread.currentThread().getName());
    }
    public void sale2()
    {
                System.out.println(Thread.currentThread().getName);
    }public void sale3()
    {
                System.out.println(Thread.currentThread().getName);
    }public void sale4()
    {
                System.out.println(Thread.currentThread().getName())
    }public void sale5()
    {
                System.out.println(Thread.currentThread().getName);
    }
    }