【问题标题】:Thread running in debug mode, but doesn't work in real time线程在调试模式下运行,但不能实时工作
【发布时间】:2016-08-11 17:10:02
【问题描述】:

我编写了服务器应用程序,它可以在几个线程上运行。我们有网络线程与客户端应用程序连接和交换数据,dataBaseConnector 线程与 sqlite 数据库连接,以及 userInterface 线程,用于对程序进行简单控制。

主要:

public class Main {

public static void main(String[] args) throws Exception {
    ServerSocket serverSocket = new ServerSocket(9000);
    DataContainer dataContainer = new DataContainer();
    DataBaseConnector dataBaseConnector = new DataBaseConnector(dataContainer);
    UserInterface userInterface = new UserInterface(dataBaseConnector, dataContainer);
    Thread userInterfaceThread = new Thread(userInterface);
    Thread dataBaseConnectorThread = new Thread(dataBaseConnector);
    userInterfaceThread.start();
    dataBaseConnectorThread.start();
    while(dataContainer.workingStatus){
        new Thread(new Handler(new Networking(dataContainer, serverSocket.accept()))).start();
    }
}
}

用户界面:

public class UserInterface implements Runnable {

private final String WELCOME = "Witaj w programie Auction House! Jest to serwer aplikacji";
private final String MENU = "Menu:";
private final String OPTION_ONE = "1. Zapisz dane do bazy";
private final String OPTION_TWO = "2. Zamknij serwer";
private final String OPTION_THREE = "3. Przywroc menu";
private DataBaseConnector dataBaseConnector;
private DataContainer dataContainer;
private int userChoice = 0;

public UserInterface(DataBaseConnector dataBaseConnector, DataContainer dataContainer) {
    this.dataBaseConnector = dataBaseConnector;
    this.dataContainer = dataContainer;
    setUpMenu();
}

@Override
public void run() {
    while (dataContainer.workingStatus){
        getUserChoice();
        makeUserRequest();
    }
}

private void setUpMenu() {
    System.out.println(WELCOME);
    System.out.println(MENU);
    System.out.println(OPTION_ONE);
    System.out.println(OPTION_TWO);
    System.out.println(OPTION_THREE);
}

private void getUserChoice() {
    Scanner scanner = new Scanner(System.in);
    userChoice = scanner.nextInt();
}

private void makeUserRequest() {
    switch (userChoice) {
    case 1: {
        dataContainer.lockTheLock();
        dataContainer.checkPoint = true;
        dataContainer.unlockTheLock();
        break;
    }
    case 2: {
        dataContainer.lockTheLock();
        dataContainer.workingStatus = false;
        dataContainer.unlockTheLock();
        break;
    }
    case 3: {
        setUpMenu();
        break;
    }
    }
}
}

1 - 用于将数据写入数据库 2 - 用于关闭服务器 3 - 再次打印菜单

和DataBaseConnector(短版):

public DataBaseConnector(DataContainer dataContainer) {
    getJDBCDriverClass();
    connection = connectToDataBase();
    statement = createStatement();
    this.dataContainer = dataContainer;
    createTables();
    selectDataFromDataBase();
    updateDataContainer();
    clearLists();
}

@Override
public void run() {
    while (dataContainer.workingStatus) {
        if (dataContainer.checkPoint) {
            dataContainer.lockTheLock();
            dropTables();
            createTables();
            setClientList();
            setAuctionList();
            setItemList();
            instertDataIntoDataBase();
            dataContainer.checkPoint = false;
            dataContainer.unlockTheLock();
        }
    }
}

还有锁:

public class Lock {
private boolean isLocked = false;

public synchronized void lock() throws InterruptedException {
    while (isLocked) {
        wait();
    }
    isLocked = true;
}

public synchronized void unlock() {
    isLocked = false;
    notifyAll();
    try {
        wait(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}

问题是:在 Eclipse 中以调试模式运行时,一切正常,但实时当我在控制台中选择 1 时没有任何反应,但选择 3 时,菜单再次打印。

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    当你在 Eclipse 中工作时,程序在你的计算机上,但是当你在网络上工作时,网络的防火墙可能会出现问题。检查使用套接字的 9000 端口是否在防火墙上打开,当然只在您使用它的网络中。

    【讨论】:

    • 是的,伙计,但它是简单的 J2SE 应用程序,socket 运行良好,但问题出在数据库上,当从用户菜单中选择 1 时程序冻结,并且数据库连接器根本不起作用,但是在调试中它工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多