2016-09-23 9 views
-6

У меня есть следующий код, и я экспериментирую с синхронизацией. Я использовал одно создание потока с использованием удлинительной резьбы t2. И я также создаю один поток через runnable. Тем не менее, я не могу заставить рабочий поток работать.threads runnable vs extends thread

Что не так? Я havent практиковал java в течение хороших 6 месяцев, таким образом возвращаясь в колебание вещей.

package threadingchapter4; 

class Table { 
void printTable(int n) { 
synchronized (this) {// synchronized block 
for (int i = 1; i <= 5; i++) 
{ 
System.out.println(n * i + " "+ Thread.currentThread().getName() + " (" 
+ Thread.currentThread().getId()); 
try { 
Thread.sleep(400); 
} catch (Exception e) { 
System.out.println(e); 
} 
       } 
} 
}// end of the method 
} 

class t1 implements Runnable { 
Table t; 

t1(Table t) { 
this.t = t; 
} 

public void run() { 
t.printTable(5); 
} 

} 

class MyThread2 extends Thread { 
Table t; 

MyThread2(Table t) { 
this.t = t; 
} 

public void run() { 
t.printTable(100); 
} 
} 
public class TestSynchronizedBlock1 { 
public static void main(String args[]){ 
Table obj = new Table();//only one object 
Thread t1 = new Thread(obj); 
MyThread2 t2=new MyThread2(obj); 
t1.start(); 
t2.start(); 
} 
} 
+3

Ваши правила форматирования и именования ужасны. И ваш код не компилируется. И вы не используете свой класс 't1' где угодно. – shmosel

+1

Пожалуйста, по крайней мере отформатируйте свой код. См. [Как форматировать код] (http://meta.stackexchange.com/a/22189/340735) –

+0

Вам следует использовать более удобные соглашения об именах. Также есть ошибка компиляции в 'Thread t1 = new Thread ((obj);'. Конечная скобка ')' отсутствует. И что такое ошибка? –

ответ

2

Я думаю, вы запутались в своих соглашениях об именах. Я предполагаю, что вы пытались сделать это:

public static void main(String args[]){ 
    Table obj = new Table();//only one object 
    Thread thread1 = new Thread(new t1(obj)); // t1 is the Runnable class 
    MyThread2 thread2 = new MyThread2(obj); 
    thread1.start(); 
    thread2.start(); 
} 
+0

@ shmosel thats работал, но почему мне нужно создать новый экземпляр t1 с помощью таблицы obj, чтобы начать поток? – Ingram

+0

@MrAssistance В отличие от того, что нужно делать? – shmosel

+0

@ shmosel well мой вопрос - почему это не то же самое, что метод вызова потока 2. Экземпляр obj передается классу MyThread2. Похоже, что в thread1 я создаю новый поток под названием thread1, а затем внутри него создаю новый поток t1 с объектом таблицы. Здесь я смущаюсь. – Ingram