java使用Thread类代表线程,所有的线程对象都必须是Thread 类或者子类的实例。
每个线程的任务是完成一定的任务,就是执行一段程序流。
目前有两种创建方式(第三种后续补充) 一种是继承Thread类 一种是实现Runnable接口`
一、继承Thread类 1.定义Thread子类,并重写run()方法。 run()方法内就是线程需要完成的任务,因此可以将run()方法称为线程执行体。 2.创建Thread子类的实例,也就是创建线程对象。 3.线程对象调用start()方法,启动线程。
package myclass; //包:编译时需要:javac -d e:\java基础 FirstThread.java 在当前文件夹中显示class文件 //运行前:set classpath=e:\java基础 //运行:java myclass.FirstThread //定义Thread子类,用来继承Thread类 class SecondThread extends Thread { private int i; //调用run()方法,run()放就是线程的执行体。 public void run() { for( ;i<100;i++) { //当线程继承Thread类后,直接使用this即可或得当前线程。 //Thread类对象的getName()返回当前线程的名字。 System.out.println(this.getName() + " " + i ); } } } public class FirstThread { public static void main(String[] args) { for(int x=0;x<100;x++) { //调用Thread类的currentThread()方法来获取当前线程 System.out.println(Thread.currentThread().getName()+ " " + x); if(x == 20) { //创建子类的实例 SecondThread st = new SecondThread(); //启动线程,线程只能调用一次start()方法,否则就会发生异常。 st.start(); } } } }
其中包括两个线程: 1.是程序显式创建并启动了一个线程。 会被this.getName()获取调用该方法的线程的名字。 2.main()方法的方法体代表主线程的线程执行体。 会被Thread.currentThread().getName()方法打印出来名字
注意:1.重写的run()方法可以作为一般方法来进行调用,这种调用不会出现线程。 同样run()方法也可以被重载,重载后的的run()方法也不是线程。 2.这两个循环变量不连续,表示他们没有共享数据。
二、实现Runnable接口创建线程类 1.建类实现接口 2.覆盖Runnable接口中的run()方法,将要运行的代码放在run()中 3.通过Thread类建立对象 4.将Runnable接口的子类作为实参传递给Thread类的构造函数中 5.调用Thread类的start()方法开启线程。
package myclass; class ThreadDemo implements Runnable //实现接口Runnable { private int i; //覆盖接口中的run()方法,run()方法中是程序的执行体。 public void run() { for( ; i<100 ;i++) { //当线程实现Runnable后,就只能使用Thread.currentThread().getName() //方法获取当前线程的名字。 System.out.println(Thread.currentThread().getName() + " " + i); } } }
class SecondThread { public static void main(String[] args) { for(int x=0;x<100;x++) { System.out.println(Thread.currentThread().getName() + " " +x); if(x == 20) { //创建Runnable接口的子类对象 ThreadDemo st = new ThreadDemo(); //将该子类对象作为实参传入到Thread构造函数中 Thread t1 = new Thread(st); Thread t2 = new Thread(st); t1.start(); t2.start();
} } }}
Runnable接口可以共享同一个线程类的实例变量。
Runnable 的优缺点是: 优点: 1.线程类实现了Runnable 类还可以继承其他类。 2.在阵中情况下,可以共享同一个target对象,所以适合多个线程来处理同一份资源,从而将代码,数据,cup分开,形成较为清晰的模型,较好地体现了面对对象的思想 缺点: 如果需要访问当前线程,只能使用Thread.currentThread()方法。
Thread的优缺点: 缺点:因为继承了Thread类,所以不能再继承其他类 优点:如果需要访问当前线程,直接使用this.就行。
