11多线程

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 的无参数抽象方法,需要由接口实现类重写该方法。

猜你喜欢

转载自www.cnblogs.com/xinmomoyan/p/11008148.html
今日推荐