2015-11-26 3 views
0

Я студент, изучающий java. (Особенно малиновый pi) У меня есть вопрос об этом мудрец. Он может быть скомпилирован. Но это не работает в моем наборе. Если вы не возражаете против ребят, не могли бы вы проверить мой код и помочь мне? Спасибо ...Java (Raspberry pi) Thread

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.net.SocketAddress; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.io.File; 
import java.io.FileWriter; 

public class RcvThread2 implements Runnable{ 
    private static final int sizeBuf = 50; 
    private Socket clientSocket; 
    private Logger logger; 
    private SocketAddress clientAddress; 

public RcvThread2(Socket clntSock, SocketAddress clientAddress, Logger logger) { 
    this.clientSocket = clntSock; 
    this.logger = logger; 
    this.clientAddress = clientAddress; 
    } 

static class CloseExtends extends Thread { 
    static final String GPIO_OUT = "out"; 
    static final String GPIO_ON = "1"; 
    static final String GPIO_OFF = "0"; 
    static final String[] GpioChannels = {"18"}; 

public static void main(String[] args) { 
    FileWriter[] commandChannels; 

    try { 
     FileWriter unexportFile = new FileWriter("sys/class/gpio/unexport"); 
    FileWriter exportFile = new FileWriter("sys/class/gpio/gpio/export"); 

for(String gpioChannel : GpioChannels) { 
    System.out.println(gpioChannel); 

    File exportFileCheck = 
     new File("sys/class/gpio/gpio" +gpioChannel); 
     if(exportFileCheck.exists()) { 
      unexportFile.write(gpioChannel); 
      exportFile.flush(); 
     } 
     exportFile.write(gpioChannel); 
     exportFile.flush(); 

     FileWriter directionFile = new FileWriter("/sys/class/gpio/gpio" + gpioChannel + "/direction"); 

     directionFile.write(GPIO_OUT); 
     directionFile.flush(); 
    } 
    FileWriter commandChannel = new FileWriter("sys/class/gpio/gpio" + GpioChannels[0] + "/value"); 

    int period = 20; 
    int repeatLoop = 25; 
    int counter; 

    while(true) { 
     for(counter = 0; counter < repeatLoop; counter++) { 
      commandChannel.write(GPIO_ON); 
      commandChannel.flush(); 
      java.lang.Thread.sleep(2, 20000); 

      commandChannel.write(GPIO_OFF); 
      commandChannel.flush(); 
      java.lang.Thread.sleep(period); 
     } 
     break; 
    } 
} catch(Exception exception) { 
    exception.printStackTrace(); 
    } 
} 
} 

public void main(){ 
try { 
    InputStream ins = clientSocket.getInputStream(); 
    OutputStream outs = clientSocket.getOutputStream(); 

    int rcvBufSize; 
    byte[] rcvBuf = new byte[sizeBuf]; 
    while ((rcvBufSize = ins.read(rcvBuf)) != -1) { 

    String rcvData = new String(rcvBuf, 0, rcvBufSize, "UTF-8"); 

    if(rcvData.compareTo("MotorLock") == 0) { 
     CloseExtends te = new CloseExtends(); 
     te.start(); 
    } 

    if(rcvData.compareTo("MotorOpen") == 0) { 
    } 

    logger.info("Received data :" + rcvData + " (" + clientAddress + ")"); 
    outs.write(rcvBuf, 0, rcvBufSize); 
    } 

    logger.info(clientSocket.getRemoteSocketAddress() + "Closed"); 
    } catch (IOException ex) { 
     logger.log(Level.WARNING, "Exception in RcvThread", ex); 
    }finally { 
     try{ 
      clientSocket.close(); 
       System.out.println("Disconnected! Client IP :" + clientAddress); 
       } catch (IOException e) {} 
      } 
     } 
    } 
+0

Что именно вы имеете в виду, когда вы говорите, что не работает? –

+2

"* Это не работает *" не очень полезно. Можете ли вы описать проблему? Если вы получите исключение, укажите стек. Если вы не получите ожидаемого результата, пожалуйста, объясните, что вы ожидаете и что получите. – assylias

+0

«Это не работает» означает, что шаговый двигатель не работает, когда я использую этот код. – UNESCO

ответ

1

Нижний главный метод никогда не называется. Если вы запустите свою программу, он выполнит метод public static void main(String[] args) {.

Я думаю, что это метод, который вы хотите запустить во второй нитке ?!

Если вы объявляете и запустить новый поток, используя

CloseExtends te = new CloseExtends(); te.start(); он будет работать резьбе public void run() { метод.

Так что, если я правильно понимаю ваше намерение, вы должны изменить имя основного метода в классе CloseExtends на метод запуска потоков и изменить подпись основного метода на основной метод java-программ public static void main(String[] args) {.

Я бы не назвал какой-либо другой метод «основным», если это не основной метод.

Вы можете увидеть пример создания нового потока с Runnable интерфейс здесь: https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html