java多线程基础篇一

以前没有太多的应用过Java多线程的知识,对多线程也就是简单了解一些,所以对这块的知识还是比较模糊。

现在不行了,接触了一个多线程应用较多的项目,所以决定把这个知识点拿出来系统学习一下。本篇文章打算介绍一些多线程基础的知识,如有理解误区请大家不吝指正。


一、概述

1、进程与线程的区别

进程是指一个内存中运行的应用程序,每个进程都有一块独立的内存空间,一个进程包含一到多个线程。

每个线程都有他所属的进程,每个线程也就是该进程的一条执行路径,线程之间是高频率快速轮换执行的,‘同时’执行只是给人的感觉。

2、Java当中线程一般有5中状态

创建状态:生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

      就绪状态:当调用了线程的start方法,线程就进入就绪状态,调用start方法后线程不是立即执行的,只是开始排队等待执行了,具体什么时候执行得看CPU心情,当线程从等待或者休眠状态回来之后也是进入到就绪状态。

      运行状态:开始运行run()函数的代码,这时候就是运行状态啦。

      阻塞状态:线程正在运行的时候被暂停就是进入到阻塞状态,sleep,suspend,wait都可以使线程进入阻塞状态。

      死亡状态:run()方法运行结束或者调用了线程的stop方法后,该线程就会死亡,对于已经死亡的线程无法使用start方法使其进入就绪状态。


1、实现Runnable接口,需要重写run()方法,线程的开启使用newThread(this).start()

package chc.runnable;

public class ThreadTest1 {
	public static void main(String[] args) {
		Runnable1 r =new Runnable1();
		Thread t1=new Thread(r);
		t1.start();
	}
}

class Runnable1  implements Runnable {

	public void run() {
		// TODO Auto-generated method stub
		for (int i = 1; i <= 5; i++) {
			System.out.println("实现Runnable接口的线程----->"+i);
		}
	}

}

2、继承Thread类

package chc.runnable;

public class ThreadTest2 {
    public static void main(String[] args) throws InterruptedException {
        Thread1 t = new Thread1();
        //t.run(); //这里也不能直接调用方法
        t.start();
        for (int i = 0; i < 100; i++) {
            System.out.println("main:"+i);
        }
    }
}

class Thread1 extends Thread{
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("Thread-----:"+i);
        }
    }
}
实际上查阅API我们知道Thread类是实现Runnable接口的。


三、run()和start的区别
1、run()方法只是Runnable对象中的一个普通方法,只是这个方法里存放了线程任务的代码。

直接调用线程对象的run()方法只是执行了一遍该线程的run()方法内的代码,他并没有启用新的线程。而start()方法是是一个新的线程进入到就绪状态,使线程队列中增加了一个线程。

2、run()是普通方法,当然可以多次调用了,而start()只可以调用一次

3、run()是普通方法,需要顺序执行,执行完才可以执行下面的代码,而start是使线程进入就绪状态可以与主线程和其他线程并发执行。

啰嗦了好几句其实都是那么一个意思,实际自己写个例子就什么都理解了:

package chc.runnable;

public class ThreadTest {
    
    /**
     * 观察直接调用run()和用start()启动一个线程的差别 
     * @author HaiCheng
     * @param args
     * @throws Exception
     */
    public static void main(String[] args){
    	Thread r=new ThreadDemo("直接调用run执行");
    	r.run();
        Thread t1=new ThreadDemo("线程一");
        t1.start();
        Thread t2=new ThreadDemo("线程二");
        t2.start();
        for(int i=0;i<100;i++){
        	System.out.println("主线程执行------>"+i);
        }
    }
    
    public static class ThreadDemo extends Thread{
    	private String ThreadName;
    	public ThreadDemo(String s){
    		this.ThreadName=s;
    	}
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println(this.getThreadName()+"执行------>"+i);
            }
        }
		public String getThreadName() {
			return ThreadName;
		}
    }
}

执行结果较长我就不贴了。


四、线程常用方法

1、sleep()   在指定毫秒内让当前正在执行的线程进入休眠状态(阻塞状态),休眠状态结束后会进入到就绪状态。

实例:

package chc.runnable;
import java.util.Date;
/**
 * sleep()指在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。
 * @author HaiCheng
 *
 */
public class SleepTest {
    public static void main(String[] args) {
        Thread2 t = new Thread2();
        t.start();
        try {
            Thread.sleep(10000); //主线程睡眠10秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //主线程睡眠10秒钟后结束t线程的三种方式
        //t.interrupt(); //这种结束方式比较粗暴,如果t线程打开了某个资源还没来得及关闭也就是run方法还没有执行完就强制结束线程,会导致资源无法关闭
        //t.stop();也是结束某个线程,这种方式比interrupt()更粗暴
        t.flag = false;
    }
}
class Thread5 extends Thread{
    boolean flag = true; //用这种方式结束线程很不错,用一个变量控制run方法什么时候不再执行,不会出现run方法没有执行完毕就结束
    @Override
    public void run() { //run方法一结束,整个线程就终止了
        while(flag){
            System.out.println("---"+new Date()+"---");
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                return;
            }
        }
    }
}

未完待续



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值