1.多线程介绍
进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
2.创建线程
java中提供了两种创建线程的方法:
- 一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。
- 另一种方法是声明一个实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。
2.1通过扩展Thread类进行创建线程
package cn.jxufe.java.chapter10.demo01; /* * 创建和启动一个线程 * 创建Thread子类对象 * 子类对象调用方法start() * 让线程程序执行,JVM调用线程中的run */ public class Test01Thread { public static void main(String[] args) { // TODO Auto-generated method stub SubThread st = new SubThread(); st.start(); for (int i = 0; i < 50; i++) { System.out.println("main..." + i); } } } /* * 定义子类,继承Thread * 重写方法run */ class SubThread extends Thread { public void run() { for (int i = 0; i < 50; i++) { System.out.println("sub..." + i); } } }
思考:线程对象调用 run方法和调用start方法区别?
线程对象调用run方法不开启线程。仅是对象调用方法。线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行。
2.2 获取线程名称
package cn.jxufe.java.chapter10.demo01; /* * 每个线程,都有自己的名字 * 运行方法main线程,名字就是"main" * 其他新键的线程也有名字,默认 "Thread-0","Thread-1" * * JVM开启主线程,运行方法main,主线程也是线程,是线程必然就是 * Thread类对象 * Thread类中,静态方法 * static Thread currentThread()返回正在执行的线程对象 */ public class Test02Thread { public static void main(String[] args) { // TODO Auto-generated method stub NameThread nt = new NameThread(); nt.setName("旺财"); nt.start(); /*Thread t =Thread.currentThread(); System.out.println(t.getName());*/ System.out.println(Thread.currentThread().getName()); } } class NameThread extends Thread { @Override public void run() { System.out.println(getName()); } }
2.3sleep 方法
package cn.jxufe.java.chapter10.demo01; public class Test03Sleep { public static void main(String[] args) { // TODO Auto-generated method stub /*for(int i = 0 ; i < 5 ;i++){ Thread.sleep(50); System.out.println(i); }*/ new SleepThread().start(); } } class SleepThread extends Thread { public void run() { for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (Exception ex) { } System.out.println(i); } } }
2.4示例
package cn.jxufe.java.chapter10.demo01; public class Test04ThreadDemo { public static void main(String[] args) { // TODO Auto-generated method stub ThreadExample te1 = new ThreadExample("线程1"); ThreadExample te2 = new ThreadExample("线程2"); ThreadExample te3 = new ThreadExample("线程3"); te1.start(); te2.start(); te3.start(); } } class ThreadExample extends Thread{ public ThreadExample(String s) { // TODO Auto-generated constructor stub setName(s); } public void run() { for (int i = 0; i < 5; i++) { System.out.println("第" +i+"次调用" +getName()); } } }
3.通过实现Runnable接口创建线程
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。
为何要实现Runnable接口,Runable是啥玩意呢?继续API搜索。
查看Runnable接口说明文档:Runnable接口用来指定每个线程要执行的任务。包含了一个 run 的无参数抽象方法,需要由接口实现类重写该方法。