1.什么是线程?
每个java都至少有一个线程---主程序当一个java程序启动时。JVM会创建主线程,并在线程中调用主程序的main()方法。
线程可以理解为“程序内部一个独立运行单位”。
在接触线程之前我们学过的都是单线程。
单线程,程序运行时的调用模式是:顺序调用。
如下
public void a(){
b();
c();
}
public void b(){
d();
}
public void d(){}
public void c(){}
只有当一个方法执行完下一个方法才能被执行,这个就是单线程的特点。
而多线程模型是将代码方法一个独立的运行单元中即线程中,让多个调用并行被执行。
2.线程和进程的区别
(1)简单来说一个进程就是一个应用程序,而线程是一个进程中多个独立运行单位。
(2)多个进程的内部数据和状态是完全独立的,而一个进程中的多个线程是共享一块内存空间和一组系统资源的,在程序内部可以互相调用,而进程间的通信大多都要通过网络实现。如我们访问google,就是我们自己机器上的IE进程和google的web服务器进程之间的通信。
(3)线程本身的数据一般寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要
小。
3.实现多线程的三个常用方法
(1)继承Thread类
(2)实现Runable接口
(3)以匿名内部内的方式创建线程
下面以统计某磁盘文件总数为例子介绍线程。
创建统计文件的线程类
/**
* 计算某个目录下文件的个数类
* 该类继承Thread线程类
*
*/
public class CountFile extends Thread{
private String path;//声明目录路径属性
/**
* 定义构造方法
* @param path要统计的目录路径
*/
public CountFile(String path){
this.path=path;
}
/**
* 定义统计文件个数的方法
* @param path要统计的目录路径
* @return返回文件个数
*/
private int count(String path){
//声明计数变量
int count=0;
File file=new File(path);
//判断该文件是否存在
if(file.exists()){
//如果存在的话,再判断是目录还是文件,是目录的话,获取该目录下文件,然后递归
if(file.isDirectory()){
File [] files=file.listFiles();
//判断files是否为空
if(files==null){
return count;
}else{
//遍历该目录下的文件
for(int i=0;i<files.length;i++){
count+=count(files[i].getAbsolutePath());
}
}
}else if(file.isFile()){
//如果是文件count累加1
count++;
}
}else{
return count;
}
return count;
}
/**
* 重写父类中run()方法
*/
public void run(){
//定义开始计数的时间
long startime=System.currentTimeMillis();
//调用统计的方法
int count=count(path);
//定义结束计数时的时间
long endtime=System.currentTimeMillis();
System.out.println("磁盘"+path+"共有文件"+count+"个,用时"+(endtime-startime)/1000+"s");
}
}
在主函数中实例化该线程对象并启动线程
/**
* 线程测试类
*
*
*/
public class ThreadTest {
/**
* 主函数
*/
public static void main(String[] args) {
//获取系统根目录
File [] files=File.listRoots();
//遍历数组,统计各个根目录下的文件总数
for(int i=0;i<files.length;i++){
//实例化线程对象
CountFile cf=new CountFile(files[i].getAbsolutePath());
//启动线程
cf.start();
}
System.out.println(files.length+"个线程已经启动");
}
}
运行结果如下
5个线程已经启动
磁盘G:\共有文件0个,用时0s
磁盘F:\共有文件2397个,用时0s
磁盘E:\共有文件4789个,用时0s
磁盘D:\共有文件14042个,用时1s
磁盘C:\共有文件86228个,用时18s
我们可以看出输出语句“5个线程已经启动”是放在最后面的但他最先输出,其实主函数也是一个线程,线程并不是同时运行,而是隔着非常短的时间间隔,一个运行一会在隔一段时间另一个运行,这个时间间隔是非常短的,我们是无法感觉到这个时间间隔的,所以在这写输出语句中哪一个先运行完就那个先输出。所以也就出现了以上的结果。
上面介绍了继承Thread类来实现多线程,另外的还可以实现Runnable接口来实现,其他都一样。
还有一个就是一匿名内部类的形式创建。
如下:
public void Mythread_count(final String path){
Thread thread=new Thread(){
public void run() {
System.out.println("++++++++++");
//调用统计文件个数的方法
int count=count(path);
System.out.println("磁盘"+path+"共有"+count+"个"+"文件");
}};
//启动线程
thread.start();
}
这样也能实现多线程。
分享到:
相关推荐
### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...
1. 设置线程状态为可运行。 2. 调用`native`方法`start0()`,这是一个本地方法,用于实际启动线程。`native`关键字表明该方法的实现位于Java虚拟机之外,通常是操作系统层面的线程调度。 ### 总结 Java多线程提供...
【Windows多线程总结】 Windows操作系统提供了一套完整的API来支持多线程编程,使得开发者可以在同一进程中同时执行多个线程,实现并发处理任务。本文将深入探讨Windows多线程编程的基本概念、线程同步、线程池以及...
1. **使用全局变量**:全局变量是所有线程共享的,因此可以直接用来传递数据。为了确保线程安全,对全局变量的访问应使用`volatile`关键字,以防止编译器优化导致的意外行为。如果需要传递复杂数据结构,可以定义...
以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一块代码时,如果每个线程都能得到预期的结果,且不产生数据不一致或同步问题,那么这块代码就被称为线程安全的。Java中的...
Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...
### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...
【多线程精心总结】 在Java编程中,多线程是一种重要的并发处理方式,它可以提高程序的执行效率,尤其在处理大量并发任务时。本文将深入探讨Java线程中的几个关键概念,包括`yield()`、`sleep()`、`wait()`、`join...
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
1. **线程基础** - 线程是操作系统分配CPU时间的基本单位,一个进程可以包含一个或多个线程。 - Java中通过`java.lang.Thread`类或者实现`Runnable`接口来创建线程。 - 主线程:每个Java应用程序都有一个主线程,...
C#.net同步异步SOCKET通讯和多线程总结 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接字(Socket)是tcp/ip网络协议接口,内部定义了许多的函数和例程...
### 线程总结笔记——基于Linux环境下的线程控制与同步 #### 一、引言 本篇“线程总结笔记”主要针对Linux环境下多线程编程中的关键概念进行了整理与归纳,尤其是针对线程同步的问题进行了深入探讨。通过一个具体...
1. **线程的创建** Java提供了两种创建线程的方式: - **继承Thread类**:自定义类继承Thread类,并重写run()方法,然后通过创建该类的实例并调用start()方法启动线程。 - **实现Runnable接口**:创建一个实现了...
【JAVA多线程总结】 Java 多线程是Java编程中的关键特性,它允许程序同时执行多个任务,提高系统的效率和响应性。本篇总结涵盖了Java多线程的基础概念、创建与启动、线程调度、同步与协作以及新特性。 **一、Java...
### 总结 本文从多线程的基础概念出发,深入探讨了Java中多线程的实现机制及线程安全问题,并介绍了几种常见的设计模式(包括单例模式、工厂模式和适配器模式),这些模式有助于解决多线程环境下的常见问题。通过对...
C++多线程总结 本文档对C++多线程编程进行了总结,介绍了三种创建线程的方法:CreateThread函数、AfxBeginThread函数和_beginthread()/_beginthreadex()函数,同时对线程的管理和终止进行了详细的讲解。 ...
C#.net 同步异步 SOCKET 通讯和多线程总结 本文旨在总结 C#.net 中的同步异步 SOCKET 通讯和多线程编程,涵盖服务端和客户端的实现细节。 一、服务端实现 服务端使用 System.Net 和 System.Net.Sockets 命名空间...
使用 `thread apply ID1 ID2 command` 命令可以让一个或者多个线程执行 GDB 命令 command。 使用 `thread apply all command` 命令可以让所有被调试线程执行 GDB 命令 command。 scheduler-locking 命令 使用 `...
1. 继承`Thread`类: 当创建一个新的线程时,你可以创建`Thread`类的子类,并重写`run()`方法。在这个`run()`方法中,你会定义线程执行的任务。例如: ```java class MyThread extends Thread { public void ...
### Java线程总结教程知识点详解 #### 一、操作系统与多线程概念 - **多任务与分时操作系统**:现代操作系统(如Windows、Linux)能够实现多任务处理,即在用户看来似乎多个应用程序在“同时”运行。实际上,这是...