学习笔记之JavaSE(21)--多线程1

今天学习的内容是进程与线程、通过继承Thread类创建线程

一、进程与线程

到目前为止,我们学习的都是有关顺序编程的知识,即程序在任意时刻只能执行一个任务。如果想要在某一时刻同时执行程序中的多个任务,就要用到并发编程,实现并发最直接的方式就是在操作系统级别使用进程下面着重说下最常用的Windows操作系统。Windows系统是多任务操作系统,它以进程为单位,每个进程都是一个正在执行的应用程序(比如QQ、微信、JVM等等),进程通常作为分配资源的基本单位。而线程则是进程中负责程序执行的基本单位,一个进程包括一个或多个线程。线程基本上不拥有系统资源,只拥有一点运行中必不可少的资源(如程序计数器和栈),但是它可以与同属于一个进程的其它线程共享该进程的全部资源

系统会给每个进程分配一段有限的使用CPU的时间,CPU在这段时间跳至这个进程中执行,而在下个时间段又随机跳至另一个进程中去执行。由于CPU转换速度很快,使得每个进程好像在同时工作一样。实际上CPU执行的是进程中的线程,如果进程中有多个线程,CPU会在这些线程中来回快速地随机切换执行,就好像这些线程是在并发地执行一样

实际上,只有在多处理器环境下才能真正地实现并发--比如Web服务器,在为每个请求分配一个线程的程序中,它可以将大量的用户请求分配到多个CPU上执行。事实上,从性能角度考虑,只有当某任务阻塞了程序的继续执行,在单处理器机器上使用并发编程才有意义(如果没有阻塞,在单处理器机器上切换执行的开销大于顺序执行),比如网络编程中等待用户输入,就要用到多线程技术。

Java实现了多线程机制,可以在JVM进程中任意地新建线程,每个线程都会在虚拟机栈上占用一个独立的执行空间,CPU会根据线程调度器的要求在不同的执行空间来回切换。注意JVM会负责主线程的启动(以及比如垃圾回收线程的启动),程序员要负责启动自己创建的线程。实现异步的两种方式:多线程和回调(JS、Vertx)。


二、通过继承Thread类创建线程

那么如何创建线程呢?第一种方法就是定义一个继承Thread类的子类(假设为TestThread类),并覆盖其中的run()方法(实际上这个方法是Thread类实现Runnable接口得来的),然后直接创建TestThread对象即可,线程的任务就定义在run()方法里面,线程会自动执行TestThread对象的run()方法。启动线程也很简单:调用该线程对象的start()方法。注意:调用start()方法只是将线程变为可执行状态,CPU不一定立刻执行该线程,该执行哪个线程是由线程调度器决定的如果调用已启动的线程的start()方法,则会发生IllegalThreadStateException,这是一种运行时异常

示例程序:

public class TestThread extends Thread{

	public TestThread(){}
	public TestThread(String name){
		super(name);
	}
	
	public static void main(String[] args){
		//新建两个线程并启动
		new TestThread("t1").start();
		new TestThread("t2").start();
		
		//System.out.println(4/0);  发生异常,main()方法弹栈,主线程结束,JVM执行剩余线程
		
		//主线程的任务
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+":i="+i);//主线程的name为main
		}
	}
	
	//自定义线程的任务
	public void run(){
		//int[] arr = new int[3];
		//System.out.println(arr[3]); 发生异常,run()方法弹栈,自定义线程结束,JVM执行剩余线程
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+":i="+i);
		}
	}
}

面试题:新建线程的几种方式?

答:继承Thread,实现Runnable接口,Java5之后还可以实现Callable接口


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值