微冷的雨之Java中的多线程初理解(一)
在讲解多线程前,我们必须理解什么是多线程?而且很多人都会将进程和线程做对比。
进程和线程
进程:进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。或者这样理解,进程是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。
那么进程和程序有什么关系呢?简单的说,一个程序至少有一个进程。
线程:是进程中某个单一顺序的控制流。也被称为轻量进程。程序执行流的最小单位。在一个程序中,这些独立运行的程序片段就叫做”线程”(Thread)。或者这样理解,线程是进程中所包含的一个或多个执行单元。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
多线程:就是同时有多个线程执行,共同维护程序中的数据。(个人理解)
多线程实现
那么,在Java中如何实现多线程呢??
解析:在Java中,实现多线程有两种方式。
方式一:用户自定义一个类,继承自Thread类,重写该类的run方法
方式二:用户自定义一个类,实现Runnable接口,并且重写接口的run方法
方式一用法:
案例:我们在main方法中写一个for循环,循环1000次。并且开启一个子线程。也循环1000次。
代码如下:
public class MyThread {
public static void main(String[] args) throws InterruptedException {
//设置并开启多线程
MyThreadTest thread=new MyThreadTest();
thread.start();
for (int i = 1; i <=1000; i++) {
System.out.println("我是心如止水的主线程的第"+i+"次输出");
}
}
}
//俺们自己写的类:继承自Thread类
class MyThreadTest extends Thread{
public void run(){
for (int i = 1; i <=1000; i++) {
System.out.println("我是害羞的子线程A的"+i+"次输出");
}
}
}
方式二用法:
public class MyThread {
public static void main(String[] args) throws InterruptedException {
//设置并开启多线程
MyThreadTestiI mi=new MyThreadTestiI();
Thread thread=new Thread(mi);
thread.start();
for (int i = 1; i <=1000; i++) {
System.out.println("我是心如止水的主线程的第"+i+"次输出");
}
}
}
//俺们自己写的类:实现了Runnable接口
class MyThreadTestiI implements Runnable{
public void run(){
for (int i = 1; i <=1000; i++) {
System.out.println("我是害羞的子线程A的"+i+"次输出");
}
}
}
线程休眠
在程序的执行过程中,如何让程序中某个线程暂停一段时间呢?
案例:写一个小程序,在子线程中,每循环一次,就让该线程休眠1s。
Main方法中代码如下:
//线程休眠
System.out.println("程序开始");
new Thread(){
public void run(){
for (int i = 1; i <=10; i++) {
//每循环一次,让程序休眠1s
try {
//这里, 必须用try,catch包裹,否则编译无法通过
//当然这里也不支持在方法上声明 throws Exception
//因为当前执行的run方法是子类的,根据异常的知识我们知道
//子类的方法的异常声明必须是父类方法异常声明的子集。但是
//我们通过查看代码可知run方法是没有进行异常声明的,所以
//这里只能采取try catch的方式。
//02。另外这里直接用的sleep,而不是 Thread.
//currentThread().sleep(millis),原因是
//sleep()方法属的类是Thread类的子类,由于Thread
//类中有sleep方法,所以在子类中可以直接使用sleep方法。
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第"+i+"次循环");
}
}
}.start();
守护线程:
//第一个线程
Thread t1=new Thread(){
public void run(){
for (int i = 1; i <=3; i++) {
System.out.println("我是第一个线程第"+i+"次循环");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
17 e.printStackTrace();
}
21 }
}
};
//第二个线程
Thread t2= new Thread(){
public void run(){
for (int i = 1; i <=23; i++) {
System.out.println("我是第 2 个线程第"+i+"次循环");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
//设置线程2为守护线程:当虚拟机发现所有的线程都为守护线程的时候,虚拟机体退出
t2.setDaemon(true);
t1.start();
t2.start();
好了,咱们今天的探讨到此结束!
微冷的雨之Java中的多线程初理解(一)的更多相关文章
- Java 中传统多线程
目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...
- Java中使用多线程、curl及代理IP模拟post提交和get访问
Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...
- 【转】Java中的多线程学习大总结
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...
- Java中的 多线程编程
Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...
- java中的多线程 // 基础
java 中的多线程 简介 进程 : 指正在运行的程序,并具有一定的独立能力,即 当硬盘中的程序进入到内存中运行时,就变成了一个进程 线程 : 是进程中的一个执行单元,负责当前程序的执行.线程就是CP ...
- Java中的多线程=你只要看这一篇就够了
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- Android学习记录(5)—在java中学习多线程下载之断点续传②
在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...
- Java中使用多线程、curl及代理IP模拟post提交和get訪问
Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...
- Java中的多线程技术全面详解
本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...
随机推荐
- Oracle的tnsnames.ora配置(PLSQL Developer)
首先打开tnsnames.ora的存放目录,一般为D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安装具体位置了. 步骤阅读 ...
- java-并发-线程
浏览以下内容前,请点击并阅读 声明 软件的并发是指同时做多件事情,java平台一开始就支持并发编程,java编程语言以及类库含有对并发最基本的支持,从5.0版本开始,java平台开始包含一些高并发的A ...
- http请求get与post请求的几种实现
[说明]:非原创,前两种post请求需要依赖Apache开源框架来实现:最后一种get/post请求则不需要依赖第三方框架 普通表单调用(post请求) /** * 普通表单调用 * 根据参数url, ...
- javascript判断数据类型的各种方法
一.Object.prototype.toString方法(摘自http://javascript.ruanyifeng.com/stdlib/object.html#toc3) //不同数据类型的O ...
- 初探javascript
javascript是一种在网络广泛应用的脚本语言,虽然名字与java相近,但其实两者并没有直接的关系,脚本语言是一种为了便于操作和拓展功能而开发出来的解释性语言,不同于传统的编程语言,脚本语言不需要 ...
- javaweb学习记录(1)
Java基础学习笔录 1.运行java程序,出现bad version number in.class file 编译器()的版本号高于运行环境(jre)的版本号,可以降低编译器版本号,也可以通过提升 ...
- 华清远见成为ARM大学计划正式合作伙伴
来源:华清远见嵌入式学院 近日,华清远见教育集团成为ARM大学计划合作伙伴,这是ARM大学计划合作伙伴中的国内唯一教育机构.此次合作是ARM公司对华清远见教育集团的高度认可,也充分证明了华清远见这些年 ...
- HTML5 WebSocket
在WebSocket API中,浏览器和服务器只需要做一个握手动作,然后,浏览器和服务器之间就形成一条快速通道,两者之间就可以直接进行数据传送,这一个功能可以应用到"字幕",自己做 ...
- 《HTTP权威指南》大块儿头
看到这样的一本书,胡乱翻开看看里面的内容,我觉得我又浮躁了.真厚啊!能学多少就学多少吧. 看看提要,这本书主要想讲的是HTTP和相关Web技术的.关于这方面的内容,知道的不多.
- 学习安装并配置前端自动化工具Gulp
Gulp和所有Gulp插件都是基于nodeJs来运行的,因此在你的电脑上需要安装nodeJs,安装过程请移驾安装并配置前端自动化工具--grunt.安装完成后,通过运行cmd进入DOS命令窗口,如图: ...