Могут ли классы в java, которые реализуют runnable, иметь методы, отличные от run ()? - PullRequest
2 голосов
/ 30 января 2009

Я пытаюсь реализовать простой класс, подобный этому:

public static void main(String args[])
{
    try
    {
        myClass test = new Thread(new myClass(stuff));
        test.start();
        test.join();
    }
    catch (Throwable t) { }
}

Когда я пытаюсь включить метод print () в myClass и использую его, я получаю «не могу найти символ» в классе java.lang.Thread. На самом деле мне не обязательно делать это, но я бы хотел просто проверить это. Должен ли я изменить его, если я хочу, чтобы мой метод print () работал?

РЕДАКТИРОВАТЬ: я извиняюсь, я только что понял, что я могу вызвать print () внутри функции run () lol. Почему я не могу позвонить на улицу, хотя? Это не имеет смысла для меня. Если я добавлю синхронизированный или что-то еще, я могу вызвать функцию за пределами выполнения / класса?

РЕДАКТИРОВАТЬ2: Извините, что я неправильно написал здесь имена.

РЕДАКТИРОВАТЬ3: В настоящее время я делаю это:

Thread test = new Thread(new myClass(stuff));
teste.start();
teste.join();

Если я использую новый Runner, кажется, я не могу использовать start () и join (). Есть ли способ сделать это?

РЕДАКТИРОВАТЬ4: Хорошо, давайте попробуем еще раз, пожалуйста: У меня есть myEnvironment, который является классом, и у меня есть myAgent, который является другим классом. myAgent - это тема. myAgent требует myEnvironment, поэтому я передавал его в качестве параметра конструктору. Однако я не смог сделать это, расширив Thread, потому что конструктор (myEnvironment) не был найден. Нужно ли устанавливать myEnvironment с помощью другой функции или я могу передать его с помощью конструктора?

Ответы [ 7 ]

15 голосов
/ 30 января 2009

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

public class MyRunner implements Runnable
{
    @Override public void run();
    public void somethingElse();
}

Runnable r = new MyRunner();
r.somethingElse(); // won't work, this method not defined by Runnable.

MyRunner m = new MyRunner();
m.somethingElse(); // success!
10 голосов
/ 31 января 2009

Вы должны помнить различные классы / интерфейсы, которые вы используете здесь:

  • Тема
  • Runnable
  • Ваши подклассы Runnable или Thread

Вы можете вызывать методы для переменной, только если объявленный тип переменной имеет этот метод. И Runnable объекты не являются потоками; они просто код, который может запустить поток.

Пример:

class MyRunnable implements Runnable() {
  public void run() { /* do run stuff */ }
  public void print() { /* do print stuff */ }
}

class MyThread extends Thread() {
  public void run() { /* do run stuff */ }
  public void print() { /* do print stuff */ }
}

Thread t = new Thread(new MyRunnable());
t.start();
t.print(); // error, t is a Thread not a MyRunnable and not a MyThread
t.join();

MyRunnable mr = new MyRunnable();
mr.run(); // doesn't run in its own thread
mr.print(); // this is ok

Runnable r = new MyRunnable();
r.run(); // doesn't run in its own thread
r.print(); // error, r is defined as Runnable which has no print() method

MyThread mt = new MyThread();
mt.start();
mt.print(); // this is ok because mt is a MyThread
mt.join();
1 голос
/ 30 января 2009

Ответ на ваш вопрос: да, они могут.

1 голос
/ 30 января 2009

Вы можете использовать дополнительные методы.

Кажется, ваша проблема в именовании ваших переменных !!

0 голосов
/ 09 апреля 2010

Я столкнулся с подобной проблемой, на самом деле не проблемой, а некоторым недоразумением.

кто-то, кто работал над моим кодом до меня, создал какой-то метод и передал Runnable в качестве параметра, более вероятно:

void myMethod(Runnable runnable){
runnable.run();
}

Тогда вызов myMethod из main выглядит так:

public static void main(String args[])
{
    try
    {
        myMethod(new Runnable(){
                      public void run() {
                          //do something...;
                }});
    }
    catch (Throwable t) { }
}

Итак, для предоставления параметра myMethod мне нужно создать экземпляр объекта (в данном случае анонимного) класса, реализующего Runnable.

У меня вопрос: нужно ли использовать Runnable в этом примере? Могу ли я использовать любой другой интерфейс? Я имею в виду, я могу создать новый интерфейс с одним методом, т.е.

interface MyInterface{ 
void doThis();
}

then change look of myMethod:
void myMethod(MyInterface myObject){
myObject.doThis();
}

И, конечно, клиент тоже:

public static void main(String args[])
{
    try
    {
        myMethod(new MyInterface (){
                      public void doThis() {
                          //do something...;
                }});
    }
    catch (Throwable t) { }
}

А может, что-то про Runnable?!

0 голосов
/ 30 января 2009

Я думаю, что ваш код в образце неверен. Эта строка не должна компилироваться, если myClass не расширяет Thread:

myClass test = new Thread(new myClass(stuff));

Вероятно, это что-то вроде этого, что приводит к ошибкам, потому что у Thread нет метода print ():

Thread test = new Thread(new myClass(stuff));

Вместо этого сделайте что-то вроде этого:

public static void main(String args[])
{
    try
    {
        myClass foo = new myClass(stuff);
        myClass test = new Thread(foo);
        test.start();
        test.join();
        foo.print();
    }
    catch (Throwable t) { }
}
0 голосов
/ 30 января 2009

Можете ли вы предоставить код, где вы на самом деле вызываете print (), и указать область, в которой определена print ()? В противном случае нам просто нужно угадать, как выглядит ваш код. Маловероятно, что ваша проблема связана с потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...