如何在Java中创建事件

时间:2013-04-11 18:37:17

标签: java multithreading events serversocket

我目前正在开发一个基于多线程套接字的Java程序,它应允许多个线程向此程序发送请求。这应该通过事件激活来处理,但我很难理解事件及其实现。下面是应该允许多个线程与程序通信的代码,但我只有1个线程。有人可以对此有所了解吗?非常感谢。

//this is a a threads class 
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Niti implements Runnable {

    public String line;
    public Socket soc;
    public boolean active=true;

    public Niti(Socket soc)
    {
        this.soc=soc;
        this.line=line;
        this.active=active;
    }


    public synchronized void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
            line=br.readLine();
            while(line!=null && !line.equals("")){

                if(!this.active)
                   break;

                System.out.println(line);
                line=br.readLine();
            }

            BufferedOutputStream bos = new BufferedOutputStream(soc.getOutputStream());
            bos.write("Poruka iz Programa".getBytes());

        }
        catch (IOException ex) {
            Logger.getLogger(Niti.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {        
           soc.close(); 

        } catch (IOException ex) {
            Logger.getLogger(Niti.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}



import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


//and this is the main class
public class Server{


    public static synchronized void main(String[] args) throws IOException, InterruptedException{

        ServerSocket ss = new ServerSocket(1000);

        while(true){
            Socket sokit = ss.accept();
            Niti n = new Niti(sokit);
            while(true){

                Thread t = new Thread(n);
                t.start();

                //Thread.sleep(4000);
                //n.active=false;
                System.out.println("nit broj:" + Thread.currentThread().getId()); 
            }   
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好吧,不看Niti类(我想是客户端处理程序类),你在这里有一个逻辑错误:

    while(true){
        Socket sokit = ss.accept();
        Niti n = new Niti(sokit);
        while(true){ // LOGIC ERROR!!!

            Thread t = new Thread(n);
            t.start();

            //Thread.sleep(4000);
            //n.active=false;
            System.out.println("nit broj:" + Thread.currentThread().getId()); 
        }   
    }

使用上面的代码,您将在第一次通过accept方法后创建无限线程。你需要做的是删除第二个(true),如下所示:

    while(true){
        Socket sokit = ss.accept();
        Niti n = new Niti(sokit);

        Thread t = new Thread(n);
        t.start();

        //Thread.sleep(4000);
        //n.active=false;
        System.out.println("nit broj:" + Thread.currentThread().getId());               
    }