鱼C论坛

 找回密码
 立即注册
查看: 2441|回复: 1

[学习笔记] 多线程(创建)

[复制链接]
发表于 2018-7-22 11:03:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-22 11:10:24 | 显示全部楼层
补上此路径的图片file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image.png
Image.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 09:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表