线程有单线程和多线程,现实中我们看电视是一个线程,吃水果也是一个线程,那么边看电视边吃水果就是多线程,而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对于线程,好久没用用过了,说的有点陌生,有什么不对的或者要补充的地方希望大家留言给我,谢谢