Skip to content

Commit e80ad0c

Browse files
committed
09.12.2016
1 parent 9035d7d commit e80ad0c

File tree

6 files changed

+224
-1
lines changed

6 files changed

+224
-1
lines changed
Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,39 @@
11
package com.javarush.test.level25.lesson07.home01;
22

33
public class TaskManipulator implements Runnable, CustomThreadManipulator {
4+
private Thread thread;
5+
46
@Override
57
public void run() {
8+
while (!thread.isInterrupted()) {
9+
try {
10+
thread.sleep(0);
11+
} catch (InterruptedException e) {
12+
e.printStackTrace();
13+
}
14+
if (thread.getState() == Thread.State.RUNNABLE) {
15+
System.out.println(thread.getName());
16+
}
17+
try {
18+
thread.sleep(90);
19+
} catch (InterruptedException e) {
20+
e.printStackTrace();
21+
}
22+
}
23+
624
}
725

826
@Override
927
public void start(String threadName) {
28+
thread = new Thread(this);
29+
thread.setName(threadName);
30+
thread.start();
1031

1132
}
1233

1334
@Override
1435
public void stop() {
15-
36+
thread.interrupt();
1637
}
38+
1739
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.javarush.test.level25.lesson09.task01;
2+
3+
/* Поживем - увидим
4+
Все исключения, которые возникают в процессе работы нити Solution, должны быть обработаны одним из вариантов:
5+
1. Если это Error, то вывести в консоль "Нельзя дальше работать"
6+
2. Если это Exception, то вывести в консоль "Надо обработать"
7+
3. Если это Throwable, то вывести в консоль "ХЗ"
8+
Реализуйте эту логику.
9+
*/
10+
public class Solution extends Thread {
11+
Thread.UncaughtExceptionHandler uncaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
12+
@Override
13+
public void uncaughtException(Thread t, Throwable e) {
14+
15+
if (e instanceof Error) {
16+
System.out.println("Нельзя дальше работать");
17+
} else if (e instanceof Exception) {
18+
System.out.println("Надо обработать");
19+
} else {
20+
System.out.println("ХЗ");
21+
}
22+
}
23+
24+
};
25+
26+
public Solution() {
27+
this.setUncaughtExceptionHandler(uncaughtExceptionHandler);
28+
}
29+
30+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.javarush.test.level25.lesson09.task02;
2+
3+
import java.util.TimerTask;
4+
5+
/* Вооружаемся до зубов!
6+
Создайте свой UncaughtExceptionHandler в виде локального класса внутри конструктора.
7+
UncaughtExceptionHandler должен маскать звездочками имя трэда.
8+
"Thread-0" должно быть заменено на "********"
9+
"Thread-4321" должно быть заменено на "***********"
10+
*/
11+
public class Solution extends TimerTask {
12+
protected TimerTask original;
13+
protected final Thread.UncaughtExceptionHandler handler;
14+
15+
public Solution(TimerTask original) {
16+
if (original == null) {
17+
throw new NullPointerException();
18+
}
19+
this.original = original;
20+
this.handler = new Thread.UncaughtExceptionHandler() {
21+
@Override
22+
public void uncaughtException(Thread t, Throwable e) {
23+
System.out.println(e.getMessage().replace(t.getName(), new String(new char[t.getName().length()]).replace('\0', '*')));
24+
// System.out.println(new String(new char[e.getMessage().length()]).replace('\0', '*'));
25+
26+
}
27+
28+
}; //init handler here
29+
}
30+
31+
public void run() {
32+
try {
33+
original.run();
34+
} catch (Throwable cause) {
35+
Thread currentThread = Thread.currentThread();
36+
handler.uncaughtException(currentThread, new Exception("Blah " + currentThread.getName() + " blah-blah-blah", cause));
37+
}
38+
}
39+
40+
public long scheduledExecutionTime() {
41+
return original.scheduledExecutionTime();
42+
}
43+
44+
public boolean cancel() {
45+
return original.cancel();
46+
}
47+
48+
public static void main(String[] args)
49+
{
50+
Thread th = new Thread(new Solution(new TimerTask()
51+
{
52+
@Override
53+
public void run()
54+
{
55+
throw new Error();
56+
}
57+
}));
58+
th.start();
59+
}
60+
61+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.javarush.test.level25.lesson09.task03;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/* Живем своим умом
7+
В классе Solution реализуйте интерфейс UncaughtExceptionHandler, который должен:
8+
1. прервать нить, которая бросила исключение.
9+
2. вывести в консоль стек исключений начиная с самого вложенного.
10+
Пример исключения: new Exception("ABC", new RuntimeException("DEF", new IllegalAccessException("GHI")))
11+
Пример вывода:
12+
java.lang.IllegalAccessException: GHI
13+
java.lang.RuntimeException: DEF
14+
java.lang.Exception: ABC
15+
*/
16+
public class Solution implements Thread.UncaughtExceptionHandler {
17+
List<String> throwableList = new ArrayList<>();
18+
@Override
19+
public void uncaughtException(Thread t, Throwable e) {
20+
t.interrupt();
21+
throwableList.add(e.toString());
22+
Throwable current = e.getCause();
23+
while (current != null) {
24+
throwableList.add(current.toString());
25+
current = current.getCause();
26+
}
27+
for (int i = throwableList.size()-1; i >= 0; i--) {
28+
System.out.println(throwableList.get(i));
29+
}
30+
}
31+
32+
public static void main(String[] args) {
33+
Thread thread = new Thread(){
34+
public void run(){
35+
try{
36+
throw new Exception("ABC", new RuntimeException("DEF", new IllegalAccessException("GHI")));
37+
} catch (Exception e){
38+
getUncaughtExceptionHandler().uncaughtException(currentThread(), e);
39+
}
40+
}
41+
};
42+
thread.setUncaughtExceptionHandler(new Solution());
43+
thread.start();
44+
}
45+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.javarush.test.level25.lesson11.task01;
2+
3+
import java.util.Random;
4+
5+
/* Обеспечение отсутствия прерывания важной операции
6+
Просмотрите метод moveMoney
7+
Если RANDOM.nextInt(5000) больше порогового значения THRESHOLD_VALUE,
8+
то обеспечьте переуступку кванта времени (переход хода для текущей нити)
9+
Добавьте этот код в единственное допустимое место.
10+
*/
11+
public class Solution {
12+
private static final double THRESHOLD_VALUE = 500;
13+
private static final Random RANDOM = new Random();
14+
15+
public synchronized void moveMoney(Account from, Account to, int amount) {
16+
from.setBalance(from.getBalance() - amount);
17+
if (RANDOM.nextInt(5000) > THRESHOLD_VALUE) {
18+
Thread.yield();
19+
}
20+
to.setBalance(to.getBalance() + amount);
21+
}
22+
23+
private class Account {
24+
private int balance;
25+
26+
public int getBalance() {
27+
return balance;
28+
}
29+
30+
public void setBalance(int balance) {
31+
this.balance = balance;
32+
}
33+
}
34+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.javarush.test.level25.lesson11.task02;
2+
3+
/* Первый закон Финэйгла: если эксперимент удался, что-то здесь не так...
4+
Обеспечьте переуступку кванта времени (переход хода для текущей нити) для последовательных выводов текста в консоль
5+
*/
6+
public class Solution {
7+
public static class YieldRunnable implements Runnable {
8+
private int index;
9+
10+
public YieldRunnable(int index) {
11+
this.index = index;
12+
}
13+
14+
public synchronized void run() {
15+
16+
System.out.println("begin-" + index);
17+
System.out.println("end-" + index);
18+
}
19+
}
20+
21+
public static void main(String[] args) {
22+
for (int i = 0; i < 10; i++) {
23+
new Thread(new YieldRunnable(i)).start();
24+
try {
25+
Thread.currentThread().join();
26+
} catch (InterruptedException e) {
27+
e.printStackTrace();
28+
}
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)