设为首页 加入收藏

TOP

java基础-多线程与并发(一)
2023-07-23 13:45:50 】 浏览:56
Tags:java 基础 程与并

以下为本人的学习笔记

 

1.进程与线程

1.1 什么是进程

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。

进程是一个具有一定独立功能的程序,一个实体,每一个进程都有它自己的地址空间

 

1.2 进程的状态

进程执行时的间断性,决定了进程可能有多种状态。事实上,运行中的进程具有以下三种基本状态。

  • 就绪状态(Ready)

  • 运行状态(Running)

  • 阻塞状态(Blocked)

cpu是有转速的,转速越快,性能越高。但CPU运行a程序时,要转到h程序,需要时间,这时候进程就会进入阻塞状态。

 

1.3 线程

线程实际上是在进程基础上调度进一步划分,一个线程启动后,里面的若干程序又可以划分成若干个线程。

线程:是进程中的一个执行路径,共享一个内存空间,程序之间可以自由切换,并发执行,一个进程最少有一个线程(单线程程序)

一个程序可以同时执行多个任务,来提高效率

例如:①同时下载多部电影

②看电影的同时吃零食

并行:就是两个任务同时运行(多个CPU)

并发:是指两个任务同时请求运行,而处理器一次只能接受一个任务,就会把两个任务安排轮流执行,由于CPU时间片运行时间较短,就会感觉是两个任务在同时执行

  • 面试题:进程和线程的区别?

 

2.线程的基本使用

线程实现的三种方式

java中如果要想实现多线程的操作,有两种实现方法:

1)继承Thread类(只能继承一个)

2)实现Runnable接口(建议使用,可以实现多个)

3)实现Callable接口

public class ThreadDeom1{
    
    public static void main(String[] args){
        MyThread mt = new Thread();
        
        MyRunnable mr = new MyRunnable();
        Thread t2 = new Thread(mr);//将实现Runnable的当成一个任务放进线程Thread里
        
        mt.start();//启动线程,(实际是,start表准备就绪,告诉虚拟机可以启动线程)
        t2.start();//可简写,合并成:new Thread(mr).start
    }
}
?
/**
创建线程方式一:
1.继承Thread类
2.重写run()方法
3.创建线程对象,调用start()开启线程
注意:线程开启不一定立即执行,有CPU调度执行
*/
class MyThread extends Thread{
    
    public void run(){
        for(int i = 0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"-"+i);
            try{
                Thread.sleep(500);
             }catch (InterruptedException e){
                 e.printStackTrace();
            }
        }
    }
}
?
/**
创建线程方式二:
1.实现Runnable接口
2.重写run()方法
3.创建Runnable接口的实现类对象
4.创建线程对象(代理),丢入实现类对象
5.调用start()开启线程
注意:线程开启不一定立即执行,有CPU调度执行
*/
class MyRunnable implement Runnable{
     public void run(){
        for(int i = 0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"-"+i);
            try{
            /**
                线程的休眠
                在当前线程的执行中,暂停指定的毫秒数,释放CPU的时间片
                释放CPU的时间片意思:CPU给一个进程P ,3秒执行时间,线程A和线程B互抢这个3秒时间片,设A抢到了,执行了3秒,此时会中断,然后CPU执行下一个进程,CPU一直转,又转到进程P,然后A和B又开始互抢这3秒时间片,A又抢到,继上次中断的位置开始执行,执行完后,就让时间片给其他线程。
            */
                Thread.sleep(500);
            
            }catch (InterruptedException e){
                e.printStackTrace();
                
            }
        }
    }
}
/**
创建线程方式三:
1.实现Callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行服务:ExecutorService ser = Exectors.newFixedThreadPool(1);
5.提交执行:Future<Boolean> result1 = ser.submit(t1);
6.获取结果:boolean r1 = result1.get();
7.关闭服务:ser.shutdownNow();
*/

案例

 

3.线程的休眠

public static void sleep(long millis) throws InterruptedException

使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),释放CPU的时间片,具体取决于系统定时器和调度程序的精度和准确性。 线程不会丢失任何显示器的所有权。

  • 参数

    millis - 以毫秒为单位的睡眠时间长度

  • 异常

    IllegalArgumentException - 如果 millis值为负数

    InterruptedException

首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇面试官:说说 String.intern() 和.. 下一篇阻塞队列详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目