您的位置:首页 > 编程语言 > Java开发

我的java之路之java的线程Thread

2012-07-16 22:24 148 查看
线程有单线程和多线程,现实中我们看电视是一个线程,吃水果也是一个线程,那么边看电视边吃水果就是多线程,而java中最重要的特性之一就是内置了对多线程的支持,多线程的官方解释为:同时存在几个执行体,按照几个不同的执行线索共同工作的情况。当然,多线程指的是宏观来讲,微观上了说,计算机不可能在同一时刻执行多个执行体。

要想理解好线程,首先要理解一下几个概念:线程,进程,程序,程序是一段静态的代码,进程是程序的一次动态的执行过程,一个进程分为多个进程!

对于线程的生命周期有以下四个:

开始创建:此时进程仅仅是创建,在内存中开辟了自己的空间罢了,并不会执行

开始运行:只有调用start();方法的时候,进程才会运行,这个时候会调用Thread的子类的run方法,因而,如果线程是继承Thread类的时候要重写run方法

中断:线程被比他级别高的占用,或者在使用CPU时,执行了wait().[可以使用notify()方法唤醒]sleep();

死亡:执行完run()方法后线程会死亡,到此线程结束对于线程的可以继承Thread,实现Runnable的方法,对于以上的知识点我们老规矩,上代码来分析

public class ThreadA extends Thread {

@Override public void run(){

//循环输出一句话

for(int i=0;i<10;){

System.out.println("!!A Thread--->");

i++; }

}

}

再写一个ThreadB,与ThreadA完全相同,只是A变成B

以下是测试类

public class ThreadLife {

//其实main方法就是一个主线程

public static void main(String[] args) {

ThreadA hello; //创建线程

hello=new ThreadA();

ThreadB world=new ThreadB(); //启动线程hello

hello.start();

//启动线程world

world.start();

//主线程的输出

for(int i=0;i<5;i++){

System.out.println("main Thread");

}

}

}

多运行几遍这个程序,你会发现每次输出会不同的我们继续,对于线程,是java的一个重点,不可能只有这么点内容,Thread是一个类,类中肯定有方法,就如String类一个样,拥有者自己的方法

currentThread()获取当前线程

notifyAll():唤醒所有的进程

线程同步synchronized,这个关键字表示着当前资源被锁定了,其他的进程不能去访问该线程的资源

最后说一个Object里面的方法:wait(),notify(),notifyAll()这些是Object类的final方法,也就是不能被重写的方法对于线程中有一个计时器线程Timer,对于这个线程我们使用定时器的时候非常有用,以下是一个定时器

public class TimerTest {

/** * @param args *

* 定时器类Timer在java.util包中。使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,

* 设定指定的任务task在指定的延迟delay后执行。定时器任务类TimerTask是抽象类,继承并重写其run()方法,可实现具体任务。

* schedule(TimerTask task, Date time)设定指定任务task在指定时间time执行。

* cancel()方法结束这个定时器。

* schedule(TimerTask task, long delay, long period)方法设定指定任务task在指定延迟delay后进行固定延迟peroid的执行。

* scheduleAtFixedRate(TimerTask task, long delay, long period)方法设定指定任务task在指定延迟delay后进行固定频率peroid的执行。

* 要实现一个定时任务,运用java中的Timer和TimerTask类可以非常容易实现实时调用处理函数。

* 这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需要

*/

public static void main(String[] args) {

Timer time = new Timer();

//在1秒后执行此任务,以后每隔3秒执行这个MyTask任务

time.schedule(new MyTask(), 1000,9000);

while(true){

Scanner scan = new Scanner(System.in);

、String str = scan.nextLine();

if(str.equals("ok")){ time.cancel();// 终止此计时器,丢弃所有当前已安排的任务。

System.out.println("任务结束"); }

}

}

static class MyTask extends TimerTask{

public void run() {

System.out.println("-----------------间隔3秒打印一次!-----------------------"); }

}

}

ok对于线程,好久没用用过了,说的有点陌生,有什么不对的或者要补充的地方希望大家留言给我,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: