2022.01.20Java多线程基础

2022.01.20多线程基础

方式一:继承Thread类

1) 定义子类继承Thread类。

2) 子类中重写Thread类中的run方法。

3) 创建Thread子类对象,即创建了线程对象。

4) 调用线程对象start方法:启动线程,调用run方法。

package www.fancy.thread;

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

public class ThreadDemo extends Thread{

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i % 2 != 0){
                try {
                    sleep(10); //让当前线程阻塞1000毫秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+":"+i);
            }

        }
    }
}

class Test{
    public static void main(String[] args) {

        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.setName("thread-2");
        threadDemo.start();

        //创建Thread匿名子类的方式
        new ThreadDemo(){
            public void run(){
                for (int i = 100; i < 200; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+i);
                    //if(i % 20 == 0){
                       // yield();            //执行到此释放当前cup的执行权

                    //}
                }
            }
        }.start();


        for (int i = 0; i < 100; i++) {
            if(i % 2 == 0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
            if(i == 20){
                try {
                    threadDemo.join();// Thread-1线程加入执行完以后,main方法的线程才继续执行
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        System.out.println(threadDemo.isAlive()); //判断threadDemo线程是否还在
    }
}

以上代码运行结果:

main:0
...
main:20
Thread-1:100
...
Thread-1:199
thread-2:1
thread-2:3
thread-2:5
...
thread-2:93
thread-2:95
thread-2:97
thread-2:99
main:22
main:24
...
main:96
main:98
false

 

方式二:实现Runnable接口

1) 定义子类继承(Object)类实现Runnable接口。

2) 子类中重写Runnable接口中的run方法。

3) 创建子类对象

4) 调用Thread类中的构造器,传入该对象,构造Thread对象

5) 对该对象调用start方法

package www.fancy.thread2;

public class mThread extends Object implements Runnable{

    private int num = 0;

    public void run(){
        for (int i = 100; i <= 200; i++) {
            if(i % 2 != 0){
                num++;
                System.out.println(java.lang.Thread.currentThread().getName()+":"+i);
                System.out.println(java.lang.Thread.currentThread().getName()+"次数:"+num);

            }
        }
    }
}

class mThread1 {
    public static void main(String[] args) {
        mThread mthread=new mThread();

        Thread t1 = new Thread(mthread);
        Thread t2 = new Thread(mthread);
        Thread t3 = new Thread(mthread);

        t1.setName("set1");
        t2.setName("set2");
        t3.setName("set3");

        t1.start();
        t2.start();
        t3.start();

    }

}

以上代码运行结果:

set3:101
set2:101
set1:101
set2次数:3
set3次数:3
set2:103
set1次数:3
set2次数:5
set3:103
set3次数:7
set3:105
set3次数:8
set3:107
set3次数:9
set3:109

...
set1:199
set1次数:150

 

方法一和方法二的区别和联系:

 

 

每日一考

1.谈谈你对程序、进程、线程的理解。

程序:完成特定任务,使用特定语言编写的指令的集合;

进程:正在运行的一个程序;

线程:一个程序内部的一条执行路径。

 

2.代码完成继承Thread的方式创建分线程

3.代码完成实现Runnable接口的方法创建线程

 

4.对比两种创建方式:

二者都要重写run方法;

实现Runnable接口的方法可以多继承,大多数使用该方法。特别是对于处理共享数据的多线程。

posted @ 2022-01-21 00:09  Fancy[love]  阅读(32)  评论(0编辑  收藏  举报