Java多线程机制(一)

一、基本概念:

        进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)

  线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)

  线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。

  多进程是指操作系统能同时运行多个任务(程序)。

  多线程是指在同一程序中有多个顺序流在执行。

二、实现:

    1、继承Thread类:

        Thread类是在java.lang类包中定义的,继承Thread类必须重写run()方法

        定义格式:class className extends Thread{   run(){};   }

class MyThread extends Thread{
	private String name;
	
	public MyThread(String name) {
		this.name=name;
	}
	
	public void run() {
		for (int i = 0; i < 1000; i++) {
			System.out.println(name+":"+i);
		}
		super.run();
	}
}

public class ThreadDemo0{
    public static void main(String args[]) {
        MyThread thread =new MyThread("A");
        thread.start();
    }
} 

说明:程序启动运行main时候,Java虚拟机启动一个进程,主线程main在main()调用时被创建,随着调用thread对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。【start()方法的调用后不是立即执行多线程代码,而是使得该线程变为为可运行态,什么时候运行是有操作系统决定的~乱序执行,只有乱序执行的代码才有必要设计为多线程】

    2、实现Runnable接口

public class MyRunnable implements Runnable {
	private String name;
	public MyRunnable(String name) {
		this.name=name;
	}
	
	@Override
	public void run() {
		for (int i = 0; i <1000; i++) {
			System.out.println(name+":"+i);
		}
	}

}
public class ThreadDemo {
	public static void main(String[] args) {
		MyRunnable r1 = new MyRunnable("A");
		MyRunnable r2 = new MyRunnable("B");
//Runnable不存在start()启动方法,故也需要定义Thread
		Thread t1 = new Thread(r1);
		Thread t2 = new Thread(r2);
		t1.start();
		t2.start();		
	}
} 

说明:在启动的多线程的时候,需要想通过Thread类的构造函数Thread(Runnable target)构造出对象,然后调用Thread对象的start()方法来运行多线程代码。

两者都是通过Thread的对象的API来控制线程的

3.区别:

如果一个类继承Thread,则不适合资源共享,但是如果实现了Runnable接口的话,则很容易实现资源共享。

...

三、状态:

    创建状态:准备好了一个多线程的对象,new出了一个Thread对象

    就绪状态:调用了start()方法,等待CPU进行调度(分配资源)

    运行状态:执行run()方法

    阻塞状态:暂时停止执行,可能将资源交给其他线程使用

    终止状态(死亡状态):线程状态

四、常用函数:

五、优先级:

    优先级设定并不百分百执行,只是可能性的帮助线程抢到CPU资源

class TheRun implements Runnable{
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			try {
				Thread.sleep(1000);
				System.out.println(Thread.currentThread().getName()+":"+i);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

public class ThreadYouXianJi {
	public static void main(String[] args) {
               
                Thread t1 = new Thread(new TheRun(),"A");
		Thread t2 = new Thread(new TheRun(), "B");
		Thread t3=  new Thread(new TheRun(), "C");
//************************8设置优先级,可能性的抢到优先级
		t1.setPriority(Thread.MIN_PRIORITY);
		t2.setPriority(Thread.NORM_PRIORITY);
		t3.setPriority(Thread.MAX_PRIORITY);
		t1.start();
		t2.start();
		t3.start();
	}
}
推荐:Java多线程学习(吐血超详细总结)



   





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值