浅谈java多线程

进程和线程

进程和线程都是一个控制流程。
一个进程通常对应一个程序
一个程序可以由多个不同的线程构成
进程是可用于资源的独立单位
进程同时又是一个可独立调度和分派的基本单位
线程因为具有许多进程所具有的特征,因此被称为轻量级进程。
线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。
线程不拥有系统资源,只拥有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。
线程可以创建和撤消,从而实现程序的并发执行。

线程的创建

在Java语言中,线程也是一种对象,但并非任何对象都可以成为线程,只有实现Runnable接口或继承了Thread类的对象才能成为线程。

Thread 类

Thread类中的主要的方法包括:
start()方法
interrupt()方法
join()方法
run()方法。
其中start()方法与run()方法最为常用,start()方法用于启动线程,run()方法为线程的主体方法,可以根据需要重写run()方法。每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
使用start()方法,线程进入Runnable(可运行)状态,它将向线程调度器注册这个线程。
调用start()方法并不一定马上会执行这个线程,正如上面所说,它只是进入Runnable 而不是Running。
注意,不要直接在程序中调用线程的run()方法。
简单举例:
Thread举例

Runnable接口

从本质上讲,Runnable是Java语言中用以实现线程的接口,任何实现线程功能的类都必须实现这个接口。
Thread类就是因为实现了Runnable接口,所以继承它的类才具有了相应的线程功能。
Runnable接口只有一个方法就是run()方法,实现Runnable()接口后必须实现run()方法。
Runnable接口

2种线程方式的比较

使用Runnable接口
Runnable适合多个相同程序代码的线程去处理同一资源的情况。把虚拟CPU(线程)同程序的代码、数据有效的分离,较好的体现了面向对象的设计思想。
避免由于Java的单继承特性带来的局限性。也就是如果新建的类要继承其他类的话,因为JAVA中不支持多继承,就只能实现java.lang.Runnable接口。
有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
继承Thread类
不能再继承他类。
编写简单,可以直接操纵线程,无需使用Thread.currentThread()。

线程的状态图

线程状态图

线程的挂起

当一个线程进入“非可执行”状态,也就是挂起状态时,必然存在某种原因使其不能继续运行,这些原因可能是如下几种情况。
(1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。
(2)通过调用join()方法使线程挂起,如果线程A调用线程B的join()方法,那么线程A将被挂起,直到线程B执行完毕为止。
(3)通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。
(4)线程在等待某个输入/输出完成。

与线程控制有关的方法

与线程控制有关的方法

线程的优先级

多线程运行时需要定义线程运行的先后顺序
线程优先级是用数字表示,数字越大线程优先级越高,取值在(1到10)。默认优先级(为5)。

public class PriThread
    {
        public static void main(String args[ ])
        {
            ThreadA a=new ThreadA();
            ThreadB b=new ThreadB();
            a.setPriority(2);//设置优先级别,数值越大优先级越高
            b.setPriority(8);
            a.start();
            b.start();
        }
    }
class ThreadA extends Thread
    {
        public void run()
        {
            System.out.println("我是线程A");
        }
    }

    class ThreadB extends Thread
    {
        public void run()
        {
            System.out.println("我是线程B");
        }
    } 
    /*
    因为在代码段当中我们把线程B的优先级设置高于线程A,所以运行结果先执行线程B的run()方法后再执行线程A的run()方法。 
    */

结束线程

结束线程有两种情况:
(1)自然消亡:一个线程从run()方法的结尾处返回,自然消亡且不能再被运行;
(2)强制死亡:调用Thread类中stop()方法强制停止,不过该方法已经被废弃。
虽然这两种情况都可以停止一个线程,但最好的方式是自然消亡,简单地说,如果要停止一个线程的执行,最好提供一个方式让线程可以完成run()的流程。
例如:线程的run()方法中执行一个无限循环,在这个循环中可以提供一个布尔变量或表达式来控制循环是否执行,在线程执行中,可以调用方法改变布尔变量的值,用这种方式使线程离开run()方法以终止线程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值