Java多线程(一)、多线程的基本概念和使用(转)

Java多线程(一)、多线程的基本概念和使用

分类: javaSE综合知识点 2012-09-10 16:06 2196人阅读 评论(0) 收藏 举报

一、进程和线程的基础知识

1、进程和线程的概念

进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)

线程:进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源)

在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。

区别:

1、是否占有资源问题

2、创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大。

3、进程为重量级组件,线程为轻量级组件

多进程: 在操作系统中能同时运行多个任务(程序)

多线程: 在同一应用程序中有多个功能流同时执行

 

2、线程的主要特点

①、不能以一个文件名的方式独立存在在磁盘中;

②、不能单独执行,只有在进程启动后才可启动;

③、线程可以共享进程相同的内存(代码与数据)。

3、线程的主要用途

①、利用它可以完成重复性的工作(如实现动画、声音等的播放)。

②、从事一次性较费时的初始化工作(如网络连接、声音数据文件的加载)。

③、并发执行的运行效果(一个进程多个线程)以实现更复杂的功能

4、多线程(多个线程同时运行)程序的主要优点

①、可以减轻系统性能方面的瓶颈,因为可以并行操作;

②、提高CPU的处理器的效率,在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性;另一方面,在多CPU系统中,可以把不同的线程在不同的CPU中执行,真正做到同时处理多任务。

二、线程的创建和启动

其实看看API,从Thread的构造方法,就可以看出创建一个线程的方式:

Thread()
          分配新的 Thread 对象。
Thread(Runnable target)
          分配新的 Thread 对象。
Thread(Runnable target,String name)
          分配新的 Thread 对象。
Thread(String name)
          分配新的 Thread 对象。
Thread(ThreadGroup group,Runnable target)
          分配新的 Thread 对象。
Thread(ThreadGroup group,Runnable target,String name)
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。
Thread(ThreadGroup group,Runnable target,String name, long stackSize)
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小
Thread(ThreadGroup group,String name)
          分配新的 Thread 对象。

后面4个构造方法创建一个线程并加入到一个线程组中,但是创建线程的方式和前面的相似。

java中创建一个线程有两种方式:

1、继承Thread类,重写run()方法,然后直接new这个对象的实例,创建一个线程的实例。然后调用start()方法启动线程

2、实现Runnable接口,重写run()方法,然后调用new Thread(runnable)的方式创建一个线程,然后调用start()方法启动线程

其实看Thread的源文件,发现它也是实现了Runnable接口的。

[java] view plaincopyprint?

  1. public class Thread implements Runnable
public class Thread implements Runnable 

1、继承Thread类的方式

[java] view plaincopyprint?

  1. public class Test1 {
  2. public static void main(String[] args) {
  3. System.out.println(Thread.currentThread().getName());
  4. MyThread myThread=new MyThread();
  5. myThread.start();
  6. }
  7. }
  8. class MyThread extends Thread{
  9. int i=0;
  10. @Override
  11. public void run() {
  12. while (i<10) {
  13. System.out.println(this.getName()+"    i的值   "+i);
  14. i++;
  15. }
  16. }
  17. }
public class Test1 {
	public static void main(String[] args) {
		System.out.println(Thread.currentThread().getName());
		MyThread myThread=new MyThread();
		myThread.start();
	}
}
class MyThread extends Thread{
	int i=0;
	@Override
	public void run() {
		while (i<10) {
			System.out.println(this.getName()+"    i的值   "+i);
			i++;
		}
	}
}


2、实现Runnable接口

[java] view plaincopyprint?

  1. public class Test1 {
  2. public static void main(String[] args) {
  3. System.out.println(Thread.currentThread().getName());
  4. Thread thread=new Thread(new MyRunnable());
  5. thread.start();
  6. }
  7. }
  8. class MyRunnable implements Runnable{
  9. int i=0;
  10. @Override
  11. public void run() {
  12. while (i<10) {
  13. System.out.println(Thread.currentThread().getName()+"    i的值   "+i);
  14. i++;
  15. }
  16. }
  17. }
public class Test1 {
	public static void main(String[] args) {
		System.out.println(Thread.currentThread().getName());
		Thread thread=new Thread(new MyRunnable());
		thread.start();
	}
}
class MyRunnable implements Runnable{
	int i=0;
	@Override
	public void run() {
		while (i<10) {
			System.out.println(Thread.currentThread().getName()+"    i的值   "+i);
			i++;
		}
	}
}

注意:

①、在继承Thread的方式中,可以使用getName()方法,来获得当前线程的名字,这是因为在Thread类中,有这个方法。可是在实现Runnable方式中,却不可以使用this.getName(),因为Runnable接口没有这个方法(可以看出来,因为我们没有提示我们需要重写这个方法),所以只能通过Thread的静态方法Thread.currentThread()取得当前的Thread对象,在调用getName()方法,来取得当前线程的名字。

②、对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。只有调用start()方法才会启动新线程。

3、两种方式的对比

采用实现Runnable接口方式的多线程具有优势,一般都会使用这种方式:

1、线程类只是实现了Runnable接口,还可以继承其他类。

2、在这种方式下,可以多个线程共享一个Runnable target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。

时间: 2024-12-29 06:52:54

Java多线程(一)、多线程的基本概念和使用(转)的相关文章

java多线程下的所的概念

锁和synchronized关键字     为了同步多线程,Java语言使用监视器(monitors),一种高级的机制来限定某一 时刻只有一个线程执行一段受监视器保护的代码.监视器的行为是通过锁来实现的,每一个对象都有一个锁.    每个线程都有一个工作内存,在里面存放从所有线程共享的主内存里拷贝来的变量.为了访问一个共享的变量,一个线程通常先要获得一个锁并刷新它的工作内存,这将共享的值从主内存被拷贝到工作内存.当线程解锁时将会把工作内存里的值写回主内存.&n bsp;   一个线程能多次获得对

Java多线程——&lt;八&gt;多线程其他概念

一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 Java多线程——<三>简单的线程执行:Executor Java多线程——<四>让线程有返回值 Java多线程——<五>后台线程(daemon) Java多线程——<六>更方便的线程 Java多线程——<七>多线程的异常捕捉 均是个人理解和总结,代

java多线程编程(一基础概念)

1.进程和线程       进程,是一个正在运行的程序实体,windows下常见的就是xxx.exe,在任务管理器中可以看见很多个进程.它是线程的容器. 线程,是进程中的一个执行流.在单线程编程中,我们的程序只有一个执行流:主线程的main方法.流,表明执行的过程是有顺序的,如main函数中的语句需要一条一条的按顺序执行,第一条语句没执行完,就不能去执行第二条语句. 可见,单线程编程是有限制的,那就是我们的语句只能串行执行,不可能发生某些语句同时执行的现象.有时我们希望某些代码并行执行,就好比我

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应"多角色"的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的"生产者,消费者模型". 很多人都对其中的一些概念不够明确,如同步.并发等等,让我

Java线程及多线程技术及应用

第6 章 Java线程及多线程技术及应用 6.1线程基本概念 1.进程和线程的基础知识 l 进程:运行中的应用程序称为进程,拥有系统资源(cpu.内存) l 线程:进程中的一段代码,一个进程中可以哦有多段代码.本身不拥有资源(共享所在进程的资源) 在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程. 区别: 1.是否占有资源问题 2.创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大. 3.进程为重量级组件,线程为轻量级组件 l 多进程: 在操作系统中能同时运行

Java中的多线程=你只要看这一篇就够了

如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”. 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数据字典,以免产生误会. 多线程:指的是这个程序(一个进程)运

JAVA线程与多线程

去安卓面试的时候通常会问一些java问题,所以呢你可能觉得答问题时答案很蛋疼,今天来介绍一下线程. 先看几个概念: 线程:进程中负责程序执行的执行单元.一个进程中至少有一个线程. 多线程:解决多任务同时执行的需求,合理使用CPU资源.多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性. ● 线程 java中的线程 使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义.实例化和启动新线程. 一个Thread类实例只是一个对

关于Python和Java的多进程多线程计算方法对比

原文请见 关于Python和Java的多进程多线程计算方法对比 搞大数据必须要正视的一个问题就是并行计算.就像执行一件任务一样,大伙一起同时干,才有效率,才会很快出成果.正所谓"众人拾柴火焰高"~ 对于并行计算,有很多高大上的概念,我也不全懂.这里就单单罗列一下我对于多进程和多线程计算的理解和总结. 在计算机中,处理一个任务,可以在一个进程中,也可以在一个线程中,确切的说,执行的话都得靠一个个线程来.在我们做某件事的时候,往往需要同时干多个任务才能达到我们所要的效果,比如说看电影,就要

Java线程与多线程教程

本文由 ImportNew - liken 翻译自 Journaldev. Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用中有两类线程——用户线程和守护线程.当启动应用时,main线程是创建的第一个用户线程,我们可以创建多个用户线程和守护线程.当所有用户进程执行完毕时,JVM终止程序. 可以对不同的线程设置不同的属性,但并不保证高优先级的线程在低优先级线程之前执行.线程调度器是操作系统的部分实现,当一个线程启动后,它的执行

设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题

设计模式--单例模式(Java)--考虑多线程环境下的线程安全问题 一:单例模式概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 二:单例模式的实现方式 特别注意,在多线程环境下,需要对获取对象实例的方法加对象锁(synchronized) 方式一:(懒汉式)程序执行过程中需要这个类的对象,再实例化这个类的对象 步骤: 1.定义静态私有对象 2.构造方法私有化保证在类的外部无法实例化该类的对象 3.定义对外开放的静