多线程(创建)
本帖最后由 chun888 于 2018-7-22 11:08 编辑多线程的创建
进程拥有一个主线程可认为就是进程自己, 其他线程就是子线程
a.为一个进程创建多个线程。有三种方式
1.继承Thread类创建一个子线程
myThread.setName("小明"); // 给线程取一个名字
/** 拿到当前线程的名称 */
String name = Thread.currentThread().getName();
优点:写法简单,其他都是缺点。
缺点:线程已经继承一个类,再不能继承其他类了。可以使用匿名内部类直接new Thread不需要继承该类。
2.实现Runnable接口创建一个子线程
优点:可以继承其他类,多个Thread对象可以使用同一个target来处理。
3.实现Callable接口创建一个子线程。
优点:可以继承其他类,多个Thread对象可以使用同一个target来处理。
线程可以有执行结果,线程可以把异常往外抛出去 。
1.继承Thread类实现多线程:
packagemochunrong.com;
public class Thread01 {
public static void main(String[] args) {
/*
* 传统继承类线程
**/
MyThread myThread = new MyThread();
myThread.setName("传统线程");//可以自命名线程的名字
myThread.start();
/*
* 继承类的线程改成匿名线程
**/
new Thread() {
public void run() {
for (int i = 0; i <= 100; i++) {
String name2 = Thread.currentThread().getName();
System.out.println("----" + name2 + "-----" + i);
}
};
}.start();
/*
* 主线程
**/
for (int i = 0; i <= 100; i++) {
String name = Thread.currentThread().getName();
System.out.println("--------" + name + "--------" + i);
}
}
}
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
String name3 = Thread.currentThread().getName();
System.out.println("----" + name3 + "-----" + i);
}
super.run();
}
}
注意:其中使用了匿名内部类来简化了传统的继承。
//Thread.currentThread().getName();那当前线程名称
2.实现接口Runnable多线程:
packagemochunrong.com;
public class Thread01 extends test {
public static void main(String[] args) {
/*
* 接口多线程
**/
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.setName("接口Runnable多线程");
thread.start();
/*
* 主线程
**/
for (int i = 0; i <= 100; i++) {
String name = Thread.currentThread().getName();
System.out.println("--------" + name + "--------" + i);
}
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
String name1 = Thread.currentThread().getName();
System.out.println("----" + name1 + "-----" + i);
}
// TODO Auto-generated method stub
}
}
注意:定义多线程要在主线程的前面。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image.png
3.callable接口实现多线程:
packagemochunrong.com;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Thread01 extends test {
public static void main(String[] args) {
try {
/*
* callable接口多线程
**/
MyCallable myCallable = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<Integer>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
/*
* 主线程
**/
for (int i = 0; i <= 100; i++) {
String name = Thread.currentThread().getName();
System.out.println("--------" + name + "--------" + i);
}
/*
* 这个是接口callable返回的结果
**/
System.out.println(futureTask.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
for (int i=0 ;i<100;i++){
System.out.println("callable"+i);
}
return 9999;
}
}
补上此路径的图片file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image.png
页:
[1]