一、线程初步创建和启动

线程概述

进程和线程
几乎每个操作系统都支持进程的概念,所有运行中的任务通常对应一条进程。当一个程序进入内存中运行,即变成了一个进程。进程是处于运行过程中的程序,具有一定的独立功能,进程是系统进行资源分配和调度的独立单位。在理解多线程之前先了解两个概念:
  • 并行:指在同一时刻,有多条指令在多个处理器上同时执行
  • 并发:指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。
线程和进程关系:一个程序运行后至少有一个进程,一个进程可以包含多个线程,但至少包含一个线程。
线程和时间片
线程和进程的标准定义过于枯燥,这里需要涉及计算机原理,所以下面将通过通俗的语言来一一说明。
线程:一段具有逻辑的执行路径。线程的执行是线性的,具有逻辑步骤的,像是数学中的流程图,第一步、第二步、第三步......。
时间片:CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。CPU运算速度非常快,当有多个任务时,通过调度合理分配每个任务执行时间,多个任务交叉执行,给用户一种同时执行的错觉。当然现在市场上普遍有多核CPU,多CPU计算机,这种计算机能实现真正意义上的多线程并行。

线程的创建

继承Thread类创建线程
  1. 新建类继承Thread,重写run方法,该方法内完成该线程需要完成的任务
  2. 创建此类的对象
  3. 调用start方法启动该线程
下面的小例子示范了继承Thread,启动线程
  1. //继承Thread
  2. public class MyThread extends Thread {
  3. public void run() {
  4. super.run();
  5. //do something
  6. }
  7. }
  8. public static void main(String[] args) {
  9. //创建线程
  10. MyThread t1 = new MyThread();
  11. //启动线程
  12. t1.run();
  13. }
实现Runnable接口创建线程
  1. 定义Runnable接口的实现类,重写run方法,该方法内完成线程需要完成的任务
  2. 穿件Runnable实现类的对象,并将此对象作为Thread的target来创建Thread对象,该Thread才是真正的线程对象
  3. 调用start方法启动该线程
下面的小例子示范此方式
  1. //实现Runnable接口
  2. public class MyRunnable implements Runnable {
  3. public void run() {
  4. //do something
  5. }
  6. }
  7. public static void main(String[] args) {
  8. //创建Runnable实例
  9. MyRunnable r = new MyRunnable();
  10. //创建Thread实例
  11. Thread thread = new Thread(r);
  12. //启动
  13. thread.start();
  14. }

补充点

实际上面两种方式指示表面上不一样,本质都是一样的,Thread是java中的线程类,内部提供了操作线程的很多方法。而Runnable接口,指示提供了一个无参无返回的回调,可供开发者定义自己的方法体。而Thread类已经实现了Runnable接口,所以可以直接new出来直接使用。
这里强调一点为什么调用start()方法,而不直接调用run()方法。初学者很多人都不明白,这里强调一下,虽然run方法中编写了执行任务的代码,但是直接调用run()方法,虽然也会执行但是没有开启新线程,那叫方法调用不是开启线程。而调用start()方法,则是通知CPU已经有一个新的线程准备就绪,可以为此线程分配时间片了,具体什么时候被执行那要看具体情况,如:此线程优先级高不高,CPU繁不繁忙等。下面以两张图清楚的展示出这两者的不同。
  1. public class MyThread extends Thread {
  2. private String name;
  3. public MyThread(String name) {
  4. this.name = name;
  5. }
  6. public void run() {
  7. super.run();
  8. for (int i = 0; i < 10; i++) {
  9. System.out.println("=======>" + "\t" + name + "\t" + i);
  10. }
  11. }
  12. }





posted @ 2016-12-29 11:05  Pullein  阅读(176)  评论(0编辑  收藏  举报