Java поток с объектом - PullRequest
       1

Java поток с объектом

0 голосов
/ 12 ноября 2011

Допустим, у меня есть класс, который содержит список отсортированных чисел.

Объект имеет функцию get, поэтому я могу видеть приватные переменные внутри класса (в данном случае, массива)

Если я поточу объект, как мне получить доступ к функции get класса?

eg
Thread t1 = new testclass();
t1.start();
t1.getvalue() ; ??

Я еще ничего не кодировал, все еще на стадии разработки моего задания

Ответы [ 4 ]

3 голосов
/ 12 ноября 2011

Обычно в Java люди используют Runnable вместо производных от Thread:

class MyThing implements Runnable {
    private int x;
    public void run() {
        x = 10;
    }
    public int getX() { return x; }
}

MyThing thing = new MyThing();
Thread t = new Thread(thing);
t.start(); // The thread starts and calls MyThing::run() in itself
t.join(); // wait for t to finish
System.out.println(t.getX());

В интерфейсе Runnable нет ничего особенного, кроме интерфейса - вы можете просто вызвать thing.run() напрямую, за исключением того, что он будет работать в вашем собственном потоке.

2 голосов
/ 12 ноября 2011

Вы хотели Runnable / Thread, который может дать вам результат после некоторой работы?

Я рекомендую заменить Thread / Runnable на Callable и отправить его в ExecutorService.

    java.util.concurrent.Callable c = new java.util.concurrent.Callable() {

        @Override
        public Object call() throws Exception {
            int result = 0;

            // e.g.
            // 1. do some work here
            // 2. update result

            return result;
        }

    };

    java.util.concurrent.ExecutorService threadpool
            = java.util.concurrent.Executors.newSingleThreadExecutor();

    java.util.concurrent.Future future = threadpool.submit(c);

    Object result = null;
    try {
        result = future.get(5, java.util.concurrent.TimeUnit.SECONDS);
    } catch (Exception e) {
        System.err.println("ERROR!");
        e.printStackTrace();
    }

    System.out.println("RESULT : "+result);
0 голосов
/ 12 ноября 2011

Предполагая, что другой синтаксис правильный, ваш код не будет компилироваться, поскольку t1 является объектом класса Thread, а класс Thread не имеет метода getvalue (). Вы не можете вызывать методы testclass непосредственно из объекта потока.

Как только вы вызовете t1.start (), будет выполнен метод run () тестового класса. Поэтому, если вы хотите вызвать getvalue (), вы должны вызвать его в методе run () и делать все, что вам нужно, или вам следует вызывать метод getvalue () из объекта тестового класса.

Внутри метода выполнения тестового класса:

public void run() {
    //Do whatever you want to when the thread starts here.
System.out.println(Thread.currentThread().getName());
    this.getvalue(); //This will call the getvalue() method of the test class.
}
0 голосов
/ 12 ноября 2011

Не совсем.

testclass t1 = new testclass();
t1.start();
t1.getvalue();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...