java基础(3)-多线程(1)

java多线程

进程与线程

进程:指一个正在执行的应用程序。每个进程执行都有一个执行顺序,该顺序称为一个执行路径或一个控制单元(进程是资源分配的最小单位)。一个进程包含1~n个线程

线程:指进程中某个单一顺序的控制流。线程控制着进程的执行(线程是CPU调度的最小单位)

多进程:指操作系统能同时运行多个任务(程序)
多线程:指在同一程序中有多个顺序流在执行

实现java多线程

在java中要实现多线程,有两种方式,一种是继承Thread类,一种是实现Runable接口

方式一:继承Thread类并复写run方法

步骤:

  • 自定义类继承Thread类
  • 在自定义类中复写Thread类中的run()方法(目的:将自定义代码存储在run方法中,让线程运行)
  • 创建类对象
  • 调用线程start方法(方法有两作用:启动线程,调用run方法

例1:

//自定义Demo类继承Thread类
class Demo extends Thread{
    //复写run()方法
    public void run(){
        for(int i=1;i<20;i++){
            System.out.println("Demo run"+"--"+i);
        }
    }

}

public class ThreadDemo{
    public static void main(String[] args){
        //创建线程Demo的线程对象
        Demo d = new Demo();
        //启动线程并执行该线程的run()方法
        //若是d.run()仅仅是对象调用run方法,而线程创建了并未运行
        d.start();
        for(int i =1;i<10;i++){
            System.out.println("wujiadong"+"--"+i);
        }
    }

}

运行结果:

wujiadong--1
wujiadong--2
wujiadong--3
wujiadong--4
wujiadong--5
wujiadong--6
wujiadong--7
wujiadong--8
wujiadong--9
Demo run--1
Demo run--2
Demo run--3
Demo run--4
Demo run--5
Demo run--6
Demo run--7
Demo run--8
Demo run--9
Demo run--10
Demo run--11
Demo run--12
Demo run--13
Demo run--14
Demo run--15
Demo run--16
Demo run--17
Demo run--18
Demo run--19

方式二:实现Runnable接口

步骤:

  • 定义类实现Runnable接口
  • 覆盖Runnable接口中的run方法
  • 创建Runnable接口的子类对象
  • 创建Thread类对象,并把Runnable接口的子类对象作为构造参数传递
  • 调用Thread类start方法开启线程并调用Runnable接口子类的run方法

例1:

class MyRunnable implements Runnable{
    public void run(){
        for(int i = 0;i<50;i++){
            System.out.println(Thread.currentThread().getName()+"--"+i);
        }
    }

}

public class Example1{
    public static void main(String[] arags){
        MyRunnable mr = new MyRunnable();
/*
        //创建线程
        Thread t1 = new Thread(mr);
        Thread t2 = new Thread(mr);
        //设置线程名称(推荐这种命名方法)
        t1.setName("wujiadong");
        t2.setName("jiangrui");
*/
        //第二种线程命名方法
        Thread t1 = new Thread(mr,"wujiadong");
        Thread t2 = new Thread(mr,"jiangrui");
        t1.start();
        t2.start();
    }

}

Thread和Runnable的区别

  • 继承Thread:线程代码存放在Thread子类run方法中
  • 实现Runnable:线程代码存放在接口子类的run方法中

实现Runnable接口相对于继承Thread类的优点:

  • 可共享一个目标对象,实现多个线程处理同一个资源
  • 可避免java单线程的限制

线程的生命周期

  • 新建状态(New): 创建线程对象就绪状态(Runnable):  线程对象创建后,其他线程调用该对象的start方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。即有执行资格无执行权
  • 运行状态(Running):  就绪状态的线程获取了CPU,执行程序代码。即有执行资格,有执行权
  • 堵塞状态(Blocked):  因为某种原因放弃CPU使用权,暂时停止运行。知道线程进入就绪状态,才有机会转到运行状态。即无执行资格无执行权
  • 死亡状态(Terminated):线程执行完了或因异常退出了run()方法,该线程结束生命周期

线程调度

  • 线程优先级
  • 线程休眠
  • 线程让步
  • 线程插队

线程优先级

lass ThreadPriority extends Thread{
    public void run(){
        for(int i =0;i<50;i++){
            System.out.println(Thread.currentThread().getName()+"--"+i);
        }
    }
}

public class Example13{
    public static void main(String[] args){
        ThreadPriority tp1 = new ThreadPriority();
        ThreadPriority tp2 = new ThreadPriority();
        ThreadPriority tp3 = new ThreadPriority();
        tp1.setName("线程a");
        tp2.setName("线程b");
        tp3.setName("线程c");

        //System.out.println(tp1.getPriority());获取默认的优先级
        //设置优先级
        tp1.setPriority(10);
        tp2.setPriority(5);
        tp3.setPriority(1);

        tp1.start();
        tp2.start();
        tp3.start();
    }
}

线程休眠

import java.util.Date;
class MyThread extends Thread{
    public void run(){
        for(int i = 0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"---"+i+",日期"+new Date());
            try{
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }

        }

    }
}

public class Example14{
    public static void main(String[] args){
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();
        MyThread mt3 = new MyThread();

        mt1.setName("邬家栋");
        mt2.setName("江睿");
        mt3.setName("徐晴玉");

        mt1.start();
        mt2.start();
        mt3.start();
    }
}

/*
上面代码需注意捕获异常或抛出异常

部分运行结果
邬家栋---0,日期Mon Oct 17 04:36:19 PDT 2016
江睿---0,日期Mon Oct 17 04:36:19 PDT 2016
徐晴玉---0,日期Mon Oct 17 04:36:19 PDT 2016
邬家栋---1,日期Mon Oct 17 04:36:20 PDT 2016
江睿---1,日期Mon Oct 17 04:36:20 PDT 2016
徐晴玉---1,日期Mon Oct 17 04:36:20 PDT 2016
江睿---2,日期Mon Oct 17 04:36:21 PDT 2016
徐晴玉---2,日期Mon Oct 17 04:36:21 PDT 2016
邬家栋---2,日期Mon Oct 17 04:36:21 PDT 2016

*/

线程让步

class MyThread extends Thread{
    public void run(){
        for(int i = 0;i<50;i++){
            System.out.println(Thread.currentThread().getName()+"--"+i);
            Thread.yield();//暂停当前线程,并执行其他线程
        }

    }
}

public class Example16{
    public static void main(String[] args){
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();

        mt1.setName("wujiadong");
        mt2.setName("jiangrui");

        mt1.start();
        mt2.start();

    }
}

/*
部分结果
...
wujiadong--41
jiangrui--30
wujiadong--42
jiangrui--31
wujiadong--43
jiangrui--32
wujiadong--44
...

*/

线程插队

class MyThread extends Thread{
    public void run(){
        for(int i=0;i<50;i++){
            System.out.println(Thread.currentThread().getName()+"--"+i);
        }
    }

}

public class Example15{
    public static void main(String[] args){
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();
        MyThread mt3 = new MyThread();

        mt1.setName("wujiadong");
        mt2.setName("jiangrui");
        mt3.setName("sunqiangkun");

        //加入join后等mt1线程运行完才开始运行mt2和mt3
        mt1.start();
        try{
            mt1.join();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        mt2.start();
        mt3.start();
    }
}

/*
部分运行结果
...
wujiadong--47
wujiadong--48
wujiadong--49
jiangrui--0
jiangrui--1
jiangrui--2
...
jiangrui--8
jiangrui--9
jiangrui--10
jiangrui--11
jiangrui--12
...

*/

守护线程

class MyThread extends Thread{
    public void run(){
        for(int i = 0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"---"+i);
        }
    }
}

public class Example17{
    public static void main(String[] args){
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();

        mt1.setName("关羽");
        mt2.setName("张飞");
        //设置守护线程
        mt1.setDaemon(true);
        mt2.setDaemon(true);        

        mt1.start();
        mt2.start();

        Thread.currentThread().setName("刘备");//设置main线程名称
        for(int x = 0;x<6;x++){
            System.out.println(Thread.currentThread().getName()+x);//打印当前线程(main线程)名称
        }

    }
}

/*
设置了关羽张飞两个为守护线程
只要刘备这个线程结束了,则另外两个线程也要结束。

*/
时间: 2024-10-10 10:12:16

java基础(3)-多线程(1)的相关文章

【BigData】Java基础_多线程

所谓的多线程就像小吃街卖铜锅米线的老板,老板就好比一个操作系统,如果5个顾客同时去买米线,那么,此时老板就会同时准备好5个铜锅,然后同时放上水.调料.米线,同时煮5个人的米线,如果逐个煮的话,那么估计煮了2个人的米线,后面3人就来找老板退款了. 官方解释:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术 在Java中实现多线程四部曲: (1)将需要用多线程方式执行的逻辑,写入一个runnable实现类中(run方法中): (2)创建出这个runnabl

Java基础4——多线程

线程依赖于进程而存在 进程:正在运行的程序 是操作系统进行资源分配和调度的独立单位 每个进程都有自己的内存空间和系统资源 多进程的意义:单进程的计算机只能做一件事情 DOS窗口就是典型的单进程 多进程的计算机可以在一个时间段内执行多个任务 单核CPU在某个时间点只能执行一件事情,事实上CPU一直在高效切换各个进程 线程:一个进程内可以执行多个任务,每个任务可以看成是一个线程,线程是程序(进程)的执行单元或执行路径,是程序使用CPU的最小单位 多线程的意义:提高应用程序的使用率 程序的执行都是在抢

3.8 java基础总结①多线程

多线程 多线程这章理论大于实践,因为在实际开发中多线程的都封装到框架里边了的,程序员一般不会写多线程,多线程属于Java里边比较底层的代码了. 线程是处理器调度的最基本单位程序>进程>线程程序是死的,当启动程序得时候会有一个或几个进程,每个进程里边可以有诺干线程.基于线程开销更 创建线程:两种方法1.声明Thread的子类,重写run方法class MyThread extends Thread{ public void run(){ }}Mythread a = new MyThread()

Java基础知识—多线程编程(五)

概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源,提高工作效率. 线程生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程. 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 就绪状态: 当线程对象调用了start()方法之后,该

java基础之多线程

参考博客 http://www.mamicode.com/info-detail-517008.html 1.进程和线程的区别 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小. 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行. 2.实现R

java基础及多线程

1.多线程 1.1.进程与线程 ? 进程就是一个运行中的程序. ? 一个进程中可以有多个线程,线程是CPU调度和分派的基本单位.我们可以理解为线程就是程序运行中的一条路径. 1.2.多线程的创建及使用 1.2.1.创建 自定义一个类继承Thread类或实现Runnable接口 1.2.2:两种创建多线程的区别 继承Thread类:Thread()或Thread(String name) 多个线程分别完成自己的任务 实现Runnable接口:Thread(Runnable target) 或Thr

java基础07 多线程

在学习操作系统时,我们会学习进程和线程,那么进程和线程又是什么东西呢? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程(thread)是操作系统能够进行运算调度的最小单位. 它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. Java程序运行原理 java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一

黑马程序员-Java基础之多线程

多线程 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺序. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量. jvm在启动的时,首先有一个主线程,负责程序的执行,调用的是main函数.主线程执行的代码都在main方法中. 当产生垃圾时,收垃圾的动作,

Java基础总结--多线程总结2

----多线程通信-----1.概述:多个线程处理同一个资源,但是各自的任务不相同eg:线程1负责存储数据,线程2负责处理该数据.数据--就是同一个资源怎样用java语言描述上面的例子:* 资源是变化的--数据是变化的--将其封装为对象* 存在两个任务不同的线程,需要2个run方法--所以封装在两个不同的线程类中* 必须保证输入和输出处理的是同一个对象-输入输出构造方法传参数(参数为资源对象引用)* 主函数里面,创建资源对象,线程类对象,启动线程2.多线程通信依然会出现线程安全的问题解决办法--

【黑马程序员】-Java基础学习-多线程

------- android培训.java培训.期待与您交流! --------- 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小. 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行.