Java学习

多线程程序的优点

背景:以单核CPU为例,只使用单个线程先后完成多个任务(调用多个方法),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?

多线程程序的优点:

1.提高应用程序的响应。对图形化界面更有意义,可增强用户体验

2.提高计算机系统CPU的利用率

序结构。将既长又复杂的进程分为多个线程独立运行,利于理解和修改

  1. 线程的创建方式一:继承Thread类

1.1步骤:

1.1.1创建一个继承Thread类的子类。

1.1.2重写Thread类的run() --->将此线程要执行的操作,声明在此方法体中

1.1.3创建当前Thread的子类的对象

1.1.4通过对象调用start().方法.

1.启动线程,

2.Java虚拟机回去调用当前线程的run方法

例题:例题,创建一个分线程1,用于遍历100以内的偶数

[拓展] 再创建一个分线程2,用于遍历100以内的偶数

package Tese0621;

/**
 * 创建一个继承Thread类的子类。
 * 重写Thread类的run() --->将此线程要执行的操作,声明在此方法体中
 * 创建当前Thread的子类的对象
 * 通过对象调用start().1启动线程 2.调用当前线程的run方法
 */
//1.创建一个继承Thread类的子类。
class PrintNumber extends Thread{
//    2.重写Thread类的run() --->将此线程要执行的操作,声明在此方法体中

    public void run(){

        for (int i=0;i<=10000;i++){
            if(i % 2 == 0){
                System.out.println(Thread.currentThread().getName()+ ":"+i);
            }
        }
    }
}
public class EvenNumberTest {
    public static void main(String[] args) {
//        3.创建当前Thread的子类的对象
        PrintNumber p1 = new PrintNumber();

//        通过对象调用start()方法.启动线程,Java虚拟机回去调用当前线程的run方法
        p1.start();

        //main方法所在线程的
        for (int i = 0; i <= 10000; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName()+":"+i+ "**********");
            }
        }
    }
}

问题: 再提供一个分线程,用于100以内偶数的遍历。?

 注意:不能让已经start()的线程,再次执行start(),否则报异常ILLegaLThreadStateException

练习:创建两个分线程,其中一个线程遍历100以内的偶数,另一个线程遍历100以内的奇数

package Tese0621;

class EvenNumber0 extends Thread{

    //输出100以内的偶数

    public void run(){

        for (int i = 0;i <= 100; i++){

            if(i % 2 == 0){

                System.out.println(Thread.currentThread().getName()+"  "+i);

            }

        }

    }

}

class EvenNumber1 extends Thread{

    //输出100以内的奇数

    public void run(){

        for (int i= 1; i <= 100; i++){

            if(i%2 != 0){

                System.out.println(Thread.currentThread().getName()+"  "+i);

            }

        }

    }

}

public class PrintNumberTest {

    public static void main(String[] args) {

//        方式1

//        EvenNumber0 e1 = new EvenNumber0();

//        EvenNumber1 e2 = new EvenNumber1();

//        //线程1:打印偶数

//        e1.start();

//        //线程2:打印奇数

//        e2.start();


        //方式2:Thread类的匿名子类的匿名对象。

        new Thread(){

            public void run(){

                for (int i= 1; i <= 100; i++){

                    if(i%2 != 0){

                        System.out.println(Thread.currentThread().getName()+"-->"+i);

                    }

                }

            }

        }.start();

    }

}

3.对比两种方式?

共同点:1. 启动线程,使用的都是Thread类中定义的start()

2.创建的线程对象,都是Thread类或其子类的实例。

不同点:一个是类的继承,一个是接口的实现。

建议:建议使用实现Runnable接口的方式

Runnable方式的好处:1.实现的方式,避免的类的单继承的局限性

2.更适合处理有共享数据的问题

3.实现了代码和数据的分离。

联系: public class Thread implements Runnable (代理模式)

你可能感兴趣的:(java,学习,开发语言)