java中如何从主线程传参数到子线程
下面这个例子和上面一样,除了说是子线程要join主线程。本例中还教会了大家,如何从主线程传参数到子线程。
马克- to-win:马克 java社区:防盗版实名手机尾号: 73203。
例:1.5.3_2-本章源码
class ThreadMark_to_win extends Thread {
Thread mainT;
Test t;
public void run() {
try {
mainT.join();
} catch (InterruptedException e) {
System.out.println("我是子程序, 也被打断");
}
System.out.println("完成"+"e 在子线程"+t.e);
}
public void setMainThread(Thread t1, Test tTest) {
mainT=t1;
t=tTest;
}
}
public class Test {
int e;
public static void main(String[] args) {
Test t=new Test();
Thread mainT = Thread.currentThread();
ThreadMark_to_win tm = new ThreadMark_to_win();
tm.setMainThread(mainT,t);
tm.start();
for (int i = 0; i < 10; i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if(i==4) tm.interrupt();
t.e = t.e + i;
}
System.out.println("主线程e = " + t.e);
}
}
输出结果:
我是子程序, 也被打断
完成e 在子线程10
主线程e = 45
后续:
马克-to-win:注意本例中还教会了大家,如何从主线程传参数到子线程。
iiii)一个线程捕获另外一个线程的异常
马克-to-win:首先我们看子线程如何捕获子线程自己的异常,和以往一样。
例:1.5.4_a:
class ThreadMark_to_win extends Thread
{
public void run()
{
for(int i=0;i<3;i++)
{
try {
Thread.sleep(100);
throw new Exception("在子线程,我自己抛出的一个异常");
} catch (InterruptedException e) {
e.printStackTrace();
}catch (Exception ee) {
ee.printStackTrace();
}
System.out.println("在子线程"+i);
}
}
}
public class Test
{
public static void main(String[] args)
{
ThreadMark_to_win tm = new ThreadMark_to_win();
tm.start();
for(int i=0;i<10;i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("在主线程"+i);
}
}
}
结果:
在主线程0
java.lang.Exception: 在子线程,我自己抛出的一个异常
在子线程0
at com.ThreadMark_to_win.run(Test.java:10)
在主线程1
java.lang.Exception: 在子线程,我自己抛出的一个异常
at com.ThreadMark_to_win.run(Test.java:10)
在子线程1
在主线程2
在子线程2
java.lang.Exception: 在子线程,我自己抛出的一个异常
at com.ThreadMark_to_win.run(Test.java:10)
在主线程3
在主线程4
在主线程5
在主线程6
在主线程7
在主线程8
在主线程9
下面我们首先看一下UncaughtExceptionHandler的用法。
马克-to-win:事实上,UncaughtExceptionHandler可以不用放在一个线程中,只要找到一个类放置就可以了或放置在它自己里面。(以下会给出一个例子),但既然找到一个类放置就可以,我们就可以把他放在另一个线程(一个线程就是一个类)中,达到别的线程处理当前线程的异常的目的。
例:1.5.4_0_3-本章源码
import java.lang.Thread.UncaughtExceptionHandler;
class ThreadMark_to_win {
Thread mainT;
Test test;
ThreadMark_to_win(Thread t1,Test t2)
{
mainT = t1;
test=t2;
mainT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
System.out.println("在子程序处理呢, 传进来的参数是"+test.name+" "
+t.getName()+" "+ e.getMessage());
}
});
}
}
public class Test {
String name="马克-to-win在主线程";
public static void main(String[] args) {
Thread mainT = Thread.currentThread();
Test t=new Test();
ThreadMark_to_win tm = new ThreadMark_to_win(mainT,t);
for (int i = 0; i < 3; i++)
System.out.println("在主线程" + i);
throw new RuntimeException("在主线程,我自己抛出的一个异常");
}
}
输出结果:
在主线程0
在主线程1
在主线程2
在子程序处理呢, 传进来的参数是马克-to-win在主线程 main 在主线程,我自己抛出的一个异常
例:1.5.4_0_4
import java.lang.Thread.UncaughtExceptionHandler;
public class Test {
String name="马克-to-win在主线程";
public static void main(String[] args) {
Thread mainT = Thread.currentThread();
Test t=new Test();
// ThreadMark_to_win tm = new ThreadMark_to_win(mainT,t);
mainT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
public void uncaughtException(Thread th, Throwable e) {
System.out.println("在子程序处理呢, 传进来的参数是"+t.name+" "
+th.getName()+" "+ e.getMessage());
}
});
for (int i = 0; i < 3; i++)
System.out.println("在主线程" + i);
throw new RuntimeException("在主线程,我自己抛出的一个异常");
}
}
结果:
在主线程0
在主线程1
在主线程2
在子程序处理呢, 传进来的参数是马克-to-win在主线程 main 在主线程,我自己抛出的一个异常