多线程(一)

面试题

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

程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。
进程(process)是程序的一次执行过程,或是正在运行的一个程序。进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域
线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。

2.代码完成继承 Thread 的方式创建分线程,并遍历100以内的自然数

/**
 * 多线程的创建,方式一:继承于Thread类
 * 1.创建一个继承于Thread类的子类
 * 2.重写Thread的run()方法 ---> 将此线程的方法声明在run()中
 * 3.创建Thread类的子对象
 * 4.通过此对象调用start()
 *
 * 例子:遍历100以内的自然数
 *
 * 说明:高优先级的线程要抢占低优先级线程cpu的执行权。
 *      但是只是从概率上讲,高优先级的线程高概率的情况下被执行。
 *      并不意味着只有当高优先级的线程执行完以后,低优先级的线程才会被执行。
 *
 * @author alpaca
 * @create 2020-06-28 9:11
 */

//1.创建一个继承于Thread类的子类
class MyThread extends Thread{
    //2.重写Thread类的run()
    @Override
    public void run() {
        for(int i=0;i<1000;i++){
            System.out.println(Thread.currentThread().getName() + ":" +Thread.currentThread().getPriority()+":"+ i);
        }
    }

}

public class ThreadTest {
    public static void main(String[] args) {
        //3.创建Thread类的子对象
        MyThread t1 = new MyThread();

        t1.setName("线程一:");
        //设置分线程的优先级
        t1.setPriority(Thread.MAX_PRIORITY);

        //4.通过此对象调用start():①启动当前线程 ②调用当前线程的run()
        t1.start();

        Thread.currentThread().setName("主线程:");
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

        //如下操作仍在main线程中执行的
        for(int i=0;i<500;i++){
            if(i%2==0) {
                //i.sout
                System.out.println(Thread.currentThread().getName()
                        + ":" +Thread.currentThread().getPriority()
                        + ":"+i + "****main()****");
            }
        }

    }
}

3.代码完成实现 Runnable 接口的方式创建分线程,并遍历100以内的自然数

/**
 *
 * 创建多线程的方式二:实现Runnable接口
 * 1.创建一个实现了Runnable接口得类
 * 2.实现类去实现Runnable中的抽象方法:run()
 * 3.创建实现类的对象
 * 4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
 * 5.通过Thread类的对象调用start()
 *
 *
 * @author alpaca
 * @create 2020-06-28 11:42
 */

//1.创建一个实现了Runnable接口得类
class MThread implements Runnable{

    //2.实现类去实现Runnable中的抽象方法:run()
    @Override
    public void run() {
        for(int i = 0;i < 100;i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}

public class ThreadTest1 {

    public static void main(String[] args) {
        //3.创建实现类的对象
        MThread m1 = new MThread();
        //4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
        //Ctrl + P 可以查看参数
        Thread t1 = new Thread(m1);
        //5.通过Thread类的对象调用start():①启动线程
        // ②调用当前线程的run() --> 调用了Runnable类型的target的run()
        t1.start();

        //再启动一个线程,遍历100以内的自然数
        Thread t2 = new Thread(m1);
        t2.setName("线程2");
        t2.start();
    }
}

4.对比两种创建方式

开发中:优先选择:实现Runnable接口的方式
原因:1. 实现的方式没有类的单继承性的局限性
2. 实现的方式更适合来处理多个线程有共享数据的情况。
联系:public class Thread implements Runnable
相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。

5.说说你对 IDAE 中 Project 和 Moudule 的理解

IDAE 中首先创建一个工程 (Project) ,最顶级的结构,
在工程下面可以声明一个一个的模块 (Moudule)

原文地址:https://www.cnblogs.com/NTyee/p/13202739.html