本文共 2948 字,大约阅读时间需要 9 分钟。
每个正在系统上运行的程序都是一个进程,每个进程包含一个或多个线程,进程可能是整个程序或程序一部分的动态执行。线程是一组指令的集合,或是一个程序部分特殊段,它可以独立运行在程序中。
第一:一个类继承java.lang.Thread类,重写run()方法,调用start()启动线程
创建Running Man类
public class RunningMan extends Thread{ private String manName; public RunningMan(){ } public RunningMan(String manName){ this.manName=manName; } public String getManName() { return manName; } public void setManName(String manName) { this.manName = manName; } public void run(){ for(int i=1;i<=100;i++){ System.out.println(this.manName+"跑到了第"+i+"米"); } }}
创建TestMan类
public class TestMan { public static void main(String[] args) { //创建线程 RunningMan r1 = new RunningMan("罗伟"); RunningMan r2 = new RunningMan("丁伟伟"); RunningMan r3 = new RunningMan("憨憨"); RunningMan r4 = new RunningMan("苏炳添"); //启动线程 r1.start(); r2.start(); r3.start(); r4.start(); }}
第二:一个类实现java.lang.Runnable接口,重写run()方法,new Thread对象调用start()启动线程
创建Running Man类
public class RunningMan implements Runnable{ private String manName; public RunningMan(){ } public RunningMan(String manName){ this.manName=manName; } public String getManName() { return manName; } public void setManName(String manName) { this.manName = manName; } public void run(){ for(int i=1;i<=100;i++){ System.out.println(this.manName+"跑到了第"+i+"米"); } }}
创建TestMan类
public class TestMan { public static void main(String[] args) { //创建线程 RunningMan r1 = new RunningMan("罗伟"); RunningMan r2 = new RunningMan("丁伟伟"); RunningMan r3 = new RunningMan("憨憨"); RunningMan r4 = new RunningMan("苏炳添"); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); Thread t3 = new Thread(r3); Thread t4 = new Thread(r4); //启动线程 t1.start(); t2.start(); t3.start(); t4.start(); }
Thread类与Runnable接口的主要区别
线程类继承自thread类就不能继承自其他类,而Runnable接口可以。
线程类继承自thread类相对于实现Runnable接口,使用起来更方便。
线程类继承自thread类可以通过new 一个对象直接去调用start()方法开启一个,而实现了Runnable接口的类需要用他的对象实例作为Thread类构造方法的参数,创建一个Thread对象,去调用start()方法开启一个线程。
通过源码我们能看出Thread也是一个Runnable,它实现了Runnable接口
实际上最终被线程执行的任务是Runnable,Thread只是对Runnable的包装,并且通过一些状态对Thread进行管理与调度Runnable接口定义了可执行的任务,它有一个无返回值的run()函数
线程的wait、sleep、join和yield函数函数名 | 作用 |
---|---|
wait | 当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁,使得其他线程可以访问,用户可以用notify、notifyAll或者指定睡眠时间来唤醒当前等待池中的线程,注意:wait、notify、notifyAll必须放在synchronized block中,否则会抛出异常 |
sleep | 该函数是Thread的静态函数,作用是使当前线程进入睡眠状态,因为其是静态方法,所以不会改变对象机锁,即使睡眠也持有对象锁,其他对象无法访问这个对象 |
join | 等待目标线程完成后再执行 |
yield | 让出执行权限,让其他线程得以优先执行,但其他线程能否优先执行是未知的,是由jvm内存分配的 |
**对象.wait():访问该线程的对象等,而不是调用wait()方法的对象等。
notify、notifyAll函数
notify用于唤醒另一线程,但对方是未知的。notifyAll用于唤醒其他所有的线程对象
更多文章
转载地址:http://znuzi.baihongyu.com/