2013-10-24 2 views
0

Недавно я начал изучать Java, и теперь я использую мой язык по выбору в моем классе параллельного программирования в uni.Перегрузка конструктора класса Thread в Java

Я работал над назначением лаборатории, которое требует от меня запускать несколько потоков и запускать их в определенном порядке. Вот код:

import java.util.concurrent.CountDownLatch; 


class Lab1{ 

public static void main(String[] args){ 

    CountDownLatch leftLatch = new CountDownLatch(3); 
    CountDownLatch midLatch = new CountDownLatch(1); 

    LabThread t1 = new LabThread(); 
    new Thread(t1).start(); 

    // (new Thread(new LabThread(new CountDownLatch(1),leftLatch,1))).start(); 
    // (new Thread(new LabThread(new CountDownLatch(0),leftLatch,2))).start(); 
    // (new Thread(new LabThread(new CountDownLatch(0),leftLatch,3))).start(); 
    // (new Thread(new LabThread(leftLatch,midLatch,4))).start(); 
//  (new Thread(new LabThread(midLatch,new CountDownLatch(0),5))).start(); 
    // (new Thread(new LabThread(midLatch,new CountDownLatch(0),6))).start(); 
    // (new Thread(new LabThread(midLatch,new CountDownLatch(0),7))).start(); 
} 
} 

public class LabThread implements Runnable{ 

CountDownLatch waitLatch = null; 
CountDownLatch decLatch = null; 
int threadNr; 

public LabThread(CountDownLatch waitLatch, CountDownLatch decLatch,int threadNr){ 
    this.waitLatch = waitLatch; 
    this.decLatch = decLatch; 
    this.threadNr = threadNr; 
} 

public void run(){ 
    try{ 
     this.waitLatch.await(); 
     this.decLatch.countDown(); 
    }catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println(threadNr); 
} 
} 

Когда я пытаюсь скомпилировать, я получаю эту ошибку:

Lab1.java:12: error: constructor Thread in class Thread cannot be applied to given types; 
    new Thread(t1).start(); 
    ^
required: CountDownLatch,CountDownLatch,int 
found: LabThread 
reason: actual and formal argument lists differ in length 
1 error 

Я знаю, что это довольно понятно, но я просто не смог найти обходной путь. Я пробовал много вещей: избавиться от перегруженного конструктора, расширив Thread вместо внедрения Runnable, все, что я думал, может помочь, но он просто продолжает прослушивать меня с этой же ошибкой, и это просто становится действительно абсурдным. Если вы знаете решение, p lease делитесь своей мудростью со мной на этом!

P.S: Я знаю, что моя логика может быть немного недостатков, но я займусь, что после того, как он компилирует :)

EDIT: * ПРОБЛЕМА решаемые *! Очевидно, все, что мне нужно было сделать, это очистить мой проект (удалить файлы классов) и скомпилировать его снова. Большое спасибо Tom Hawtin - tackline и fazomisiek за предложение сделать это. Я не понимал, что оставить старые файлы имело какой-либо эффект при компиляции заново. Виноват ! :) Спасибо всем за ваши предложения, не ожидал получить ответ так быстро

+1

Удивлен, что вы не получили эту ошибку для 'new LabThread()' –

+0

Я бы предположил, что вы изначально называли LabThread' Thread'. Удалите все ваши файлы '.class' и повторите попытку. –

+0

Ничего себе. Я удалил все мои файлы .class, и теперь он компилируется. Забавно, как это получилось! Большое спасибо, Том! На ваш комментарий, но у меня еще нет нужной репутации :) Приветствия! –

ответ

0

Ваш вопрос кажется немного немного грязным - исключение броска не соответствует вашему коду. Но, вы должны использовать что-то вроде этого:

LabThread t1 = new LabThread(leftLatch, midLatch, 69); 
new Thread(t1).start(); 

(Но вы должны думать о логике вы хотите для того чтобы достигнуть, т.е. сколько нить работать, когда и т.д.)

BTW: Вы уверены, вы сохраняете файл перед компиляцией? (эта ошибка неожиданна)

BTW2: Вы должны вызвать super() в своем конструкторе (вы должны вызвать конструктор родительского класса - это хорошая практика).

+0

Выполнение этого, как вы сказали выше, не помогло, к сожалению Да, я сохраняю файл каждый раз перед компиляцией И я попробовал вызов super() раньше, не помог, я думал, что это может быть проблема. Пробовал с super() снова только сейчас, используя ваше предложение, ту же ошибку. Thx, хотя! :) –

+0

У вас есть некоторые проблемы с компиляцией - обновите свой проект, очистите проект и т. Д. И повторите попытку. Вы используете IDE (Eclipse, IntelliJ)? – FazoM

+0

Я не использую никаких IDE во время обучения. Текстовый редактор + javac в терминале! Уборка - отличная идея, хотя, как оказалось. Будет ли это делать чаще? :) –

0

Как только вы определяете конструктор-аргумент, вы должны явно определить конструктор без аргументов. Проблема с вашим кодом заключается в том, что конструктор LabThread() не существует.

Вы можете сделать одно из следующих действий.

  1. Определить конструктор без аргументов
  2. Использовать определенный конструктор с тремя-аргументами.
  3. Удалите конструктор с тремя аргументами.
+0

К сожалению, я не заметил, что использовал конструктор no-arg. Я исправил ошибку, и это STILL дает мне ту же ошибку! Я также попытался предоставить конструктор no-arg ранее, не помог. еще, THX для предложения –

Смежные вопросы