1)问?说说多线程的几种创建方式?
概述
在JAVA中,用Thread类代表线程,所有线程对象,都必须是Thread类或者Thread类子类的实例。每个线程的任务就是执行一段顺序执行的代码,JAVA使用线程执行体来容纳这段代码。所以,我们创建线程时,主要是根据实际需求,编写放入线程执行体的代码
创建多线程的三种方式
一、通过继承Thread类创建线程类
步骤如下:
1、定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体;
2、创建该类的实例对象,即创建了线程对象;
3、调用线程对象的start()方法来启动线程;
代码实现
public class ExtendThread extends Thread {
private int i;
public static void main(String[] args) {
for (int j = 0;j < 50; j++){
//调用Thread类的currentThread()方法获取当前线程
System.out.println(Thread.currentThread().getName()+ "" + j);
if(j==10){
//创建并启动第一个线程
new ExtendThread().start();
//创建并启动第二个线程
new ExtendThread().start();
}
}
}
@Override
public void run() {
for (;i<100;i++) {
System.out.println(this.getName() + "" + i);
}
}
}
1、上述的getName()方法是返回当前线程的名字,也可以通过setName()方法设置当前线程的名字;
2、当JAVA程序运行后,程序至少会创建一个主线程(自动),主线程的线程执行体不是由run()方法确定的,而是由main()方法确定的;
3、在默认情况下,主线程的线程名字为main,用户创建的线程依次为Thread—1、Thread—2、....、Thread—3;
注意!!!
1、结果中有三个线程;分别是main、Thread-0 、Thread-1
2、Thread-0 、Thread-1两个线程输出的成员变量 i 的值不连续(这里的 i 是实例变量而不是局部变量)。因为:通过继承Thread类实现多线程时,每个线程的创建都要创建不同的子类对象,导致Thread-0 、Thread-1两个线程不能共享成员变量 i ;
3、线程的执行是抢占式,并没有说Thread-0 或者Thread-1一直占用CPU,与线程优先级有关
二、通过实现Runnable接口创建线程类
步骤:
1、定义一个类实现Runnable接口;
2、创建该类的实例对象obj;
3、将obj作为构造器参数传入Thread类实例对象,这个对象才是真正的线程对象;
4、调用线程对象的start()方法启动该线程;
public class ImpRunnable implements Runnable {
private int i;
public void run() {
for (;i<50;i++) {
//当线程类实现Runnable接口时,要获取当前线程对象只有通过Thread.currentThread()获取
System.out.println(Thread.currentThread().getName() + "" + i);
}
}
public static void main(String[] args) {
for (int j = 0 ;j < 30;j++){
System.out.println(Thread.currentThread().getName() + "" + j);
if (j ==10) {
ImpRunnable thread_target = new ImpRunnable();
//