Java基础之多线程

目录

一、线程

        1)什么是线程?什么是进程?

        2)线程的创建方式?   

        3)线程的生命周期?

        4)什么时候会出现线程安全问题?如何解决?

        5)并发和并行的区别?

        6)Java中的守护线程是什么?


一、线程
        1)什么是线程?什么是进程?

                进程:进程是系统中正在运行的一个程序,程序一旦运行就是进程。

                线程:一个进程可以拥有多个线程,线程是进程的一个特定执行路径。

        2)线程的创建方式?   

                继承Thread类:

public class ThreadTest01 {
    public static void main(String[] args) {
        myThread myThread = new myThread();
        myThread.setName("myThread");
        //启动线程
        myThread.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + "-->>" + i);
        }
        myThread.run = false;
    }
}

class myThread extends Thread {
    Boolean run = true;

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            //这里不把if语句放在for外面是因为线程终止后再次启动时会从上一次终止的地方继续执行
            //如果放在外面mian方法里的for循环执行完毕以后会继续从 i = 5 开始执行而不会判断for外面的if语句
            if (run) {
                System.out.println(Thread.currentThread().getName() + "--->" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                return;
            }
        }
    }
}

                实现Runnable接口:

public class ThreadTest02 {


    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        //更改线程的名字
        thread.setName("t");
        //启动线程
        thread.start();
        for (int i = 0; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + "--->" + i);
        }
        
    }
}

//实现线程的其中一种方式
class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + "--->" + i);
        }
    }
}

                实现CallAble接口:  

                        使用CallAble实现线程时,启动是调用call()方法,而不是start()方法。使用Callable实现线程时可以返回值,而其他两种不可以

public class ThreadTest03 {
    public static void main(String[] args) {
        Callable callable = new AAA();
        try {
            Object call = callable.call();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

class AAA implements Callable {
    private Object object = new Object();

    @Override
    public Object call() throws Exception {
        synchronized (object) {
            System.out.println("执行call方法");
            t2();
        }
        return null;
    }

    public void t2() {
        synchronized (object) {
            System.out.println("执行t2方法");
        }
    }
}
        3)线程的生命周期?

                新建->就绪->运行->阻塞->死亡

        4)什么时候会出现线程安全问题?如何解决?

                条件1:多线程并发

                条件2:有共享数据

                条件3:共享数据有修改的行为

                解决方法:线程排队执行。(不能并发)。用排队执行解决线程安全问题。 这种机制被称为:线程同步机制。就是使用synchronized关键字将操作共享数据的代码块进行同步,这样就能保证同一时间只有一个线程能操作数据。

        5)并发和并行的区别?

                并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果

                并行(parallel):指在同一时刻有多条指令在多个处理器上同时执行

                来个比喻:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。

        6)Java中的守护线程是什么?

                在Java中有两类线程:User Thread(用户线程)Daemon Thread(守护线程) 。用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务,守护线程最典型的应用就是GC(垃圾回收器)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值