Java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用就是执行一段程序流(完成一定的任务)。
Java使用线程执行体来代表这段程序流。
1. 继承Thread类创建线程类
package org.apache; public class ThreadDemo1 extends Thread { private int i; /* * 重写run方法,也就是线程执行体 * 当线程类继承Thread类时,直接使用this即可取得当前线程 * 直接调用getName()方法即可返回当前线程的名字 */ public void run(){ for ( ; i<100;i++){ System.out.println(getName() + " " + i); } } public static void main(String[] args) { for (int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName() + " "+i); if(i==20){ //创建并启动第一个线程 new ThreadDemo1().start(); //创建并启动第二个线程 new ThreadDemo1().start(); } } } }
执行结果:
注意:实际上该程序有三个线程,main()方法是主线程,显示的创建了两个子线程。
Thread-0和Thread-1 i的值是不连续的,所以Thread-0和Thread-1不能共享Thread类的实例变量。
2. 实现Runnable接口创建线程类
package org.apache; public class ThreadDemo2 implements Runnable { private int i; //当实现Runnable接口时必须用Thread.currentThread().getName()获取当前线程 public void run() { for ( ; i<100;i++){ System.out.println(Thread.currentThread().getName() + " " + i); } } public static void main(String[] args) { for (int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName() + " "+i); if (i==20){ ThreadDemo2 td = new ThreadDemo2(); //通过new Thread(target,name)方法创建线程 new Thread(td,"线程1").start(); new Thread(td,"线程2").start(); } } } }
结果:
i的值是连续的,共享同一个线程类的实例变量(其实是线程的target类)
时间: 2024-10-09 23:28:44