1.继承Thread类创建线程
因为使用此方法创建线程类,此线程类需要继承 Thread类并重写 Thead类的un()方法因为 Tivend类的n()方法是线程要执行操作任务的方法,所以线程要执行的操作代码都需要写在run()方法中,并通过调用 start()方法启动线程后调用
下面来编写代码,用继承 Tead类的方式创建线程在线程中输出1100的整数可参考以下步骤
(1)定义 My Thread类继承 Thread类
(2)重写run()方法在run()方法中实现数据输出,
//通过继承Thread类来创建线程
public class MyThread extends Thread{
//重写run()方法
public void run(){
for(int i=1;i<100;i++){
System.out.println(Thread.currentThread.getName()+":"+i);
}
}
}
(3)创建线程对象,调用start()方法启动线程
public class Test{
public static void main(String[] args){
MyThread my=new MyThread();
my.start();//启动线程
}
}
运行结果:
以上代码中, Thread current Thread( getName()为获取当前线程名,在未指定时,自定义线程默认名称为Thread-加序号(序号为从0开始的整数)
注意已启动的线程对象不能再次调用start方法,否则会抛出 IllegalThreadState Exception异常。通过以上结果,是否会有这样的疑问,线程实例调用 start()方法和直接调用run()方法有什么区别呢?
调用 start()方法表示该线程处于启动状态,等待操作系统分配资源执行run()方法中的代码
在多个线程同时处于启动状态时,线程是交替执行的。而直接调用run()方法和之前学习过的调用实例方法没有区别,程序是按顺序执行的,属于单线程执行模式。
在上述测试类的main()方法中再创建一个线程实例并启动,代码如下:
public class Test{
public static void main(String]args){
MyThread thread= new MyThread();
MyThread thread2= new MyThread();//创建thread22
thread. start();
thread2. start();//启动 thread2
}
}
运行结果如下:
从运行结果可以看出,两个线程对象调用tart()方法启动后,各个都会输出100以内的整数相当于每个线程有自己独立的执行路径两个分支相互不影响,并行执行。但由于CPU在一个时间点只能执行一个线程,因此多个线程是交替执行的,获得CPU时间片的线程即刻执行,当前时间片执行完毕后CPU就会执行获得下一个时间片的线程。分配的时间片长度不是完全一致的可多可少因此每次运行的结果有所不同,总之是轮换交替执行的。
2.实现Runnable接口创建线程
使用继承 Thread美的方式创建线程简单明了,符合大家的习惯,但它也有一个缺点如果定义的类已经继承了其他类,则无法再继承 Thrend类,使用Runnable接口创建线程的方式可以解决上述问题。
Runnable接口定义在 java lang包中,其中声明了一个抽象方法run(),即 public void run(),一个类可以通过实现 Runnable接口并实现其run()方完成线程的所有活动,已实现的run(方法称为该线程对象的线程体,任何实现 Runnable接口的对象都可以作为一个线程的目标对象。
下面来编写代码,使用实现 Runable接口的方式创建线程,实现输出100以内的整数参考步骤如下
(1)定义 MyRunnable类实现 Runnable接口,并实现 Runnoble接口的run()方法,在run(方法中
实现输出数据
(2)创建MyRunnable类的对象 myRunnable
(3)创建一个Thread类的对 my Thread.将 myRunnable对象作为 Thread类构造方法的参数传人(4)调用my Thread对象的 start()方法启动线程
示例代码如下:
public class MyRunnable impl ements Runnable{
//实现run()方法
public void run() {
for(int i=1;i<100;i++) {
System.out.println (Thread.currentThread().getName () +":"+i) ;
}
}
}
}
//测试类
public class Test {
public static void main(String[] args){
MyRunable myRunable = new MyRunnable();
Thread myThread = new Thread (myunnable);
myThread.start();
}
}
运行结果如图:
从运行结果上看,和第一种方式创建没有区别。需要注意的是,第二种方式通过
Thread thread = new Thread (new MyRunnable( ))创建线程对象。
两种创建线程的方式有各自的特点和应用领域:直接继承Thread类的方式,编写简单,可以直接操作线程.适用于单继承的情况:当个线程继承了 另一个类时,就只能用实现Runnable接口的
方式来创建线程,而且这种方式还可以实现多个线程之间资源的共享。