chun888 发表于 2018-7-22 11:03:29

多线程(创建)

本帖最后由 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;
      }
      
}



chun888 发表于 2018-7-22 11:10:24

补上此路径的图片file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image.png
页: [1]
查看完整版本: 多线程(创建)