一、进程与线程:
- 进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。
- 线程:是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。
- 从Thread类继承:
- class MyThread extends Thread
-----继承Thread的类必须重写Thread中的run()方法,并且在创建MyThread实例对象时,如果要启动线程采用start()方法,此方法调用run()
- yield()方法
- setPriority()
注:后台线程,如果一个进程中没有非后台线程在运行,则JVM将要退出。将线程标识为后台线程:setDaemon(true),此方法要在线程start()之前调用
- 实现Runnable接口:
- class MyThread implements Runnable
- MyThread mt = new MyThread();
- new Thread(mt).start();
三、实现多线程程序的有以上两种方式,特点如下:
- 继承Thread,Thread中有许多方法可以调用
- 接口Runnable中只有一个run()方法,如果自定义线程类已经继承另一个类而无法继承Thread类,则可以实现Runnable接口
- 实现接口Runnable可以让多个线程共享同一个变量,如:
- class MyThread extends Thread{
- int index = 0;
- public void run(){
- while(true){
- System.out.println(Thread.currentThread().getName()+":"+index++);}}}
- MyThread mt = new MyThread();
- new Thread(mt).start();
- new Thread(mt).start();
- new Thread(mt).start();
也可以用内部类来实现
- class MyThread extends Thread{
- int index = 0;
- private class InnerThread extends Thread{
- public void run(){
- while(true){
- System.out.println(Thread.currentThread().getName()+":"+index++);}}}
- Thread getThread(){
- return new InnerThread();}}
- MyThread mt = new MyThread();
- mt.getThread().start();
- mt.getThread().start();
- mt.getThread().start();
四、用多线程实现火车票售票系统
- class TicketsSystem{
- public static void main(String[] args){
- SellThread st = new SellThread();
- new Thread(st).start();
- new Thread(st).start();
- new Thread(st).start();
- new Thread(st).start();}}
- class SellThread implements Runnable{
- int tickets = 100;
- public void run(){
- while(true){
- try{
- Thread.sleep(10);//线程睡眠10毫秒
- }catch(Exception ex){
- ex.printStackTrace();}
- if(tickets>0){
- System.out.println(Thread.currentThread().getName()+"sell tickets:"+tickets);
- tickets--;}}}}