搜索
首页Javajava教程菜鸟初学Java的备忘录(三)

菜鸟初学Java的备忘录(三)

Dec 20, 2016 pm 01:47 PM
java

今天开始学习java中多线程的实现.

线程是一些可以并行的,独立的执行的代码.之前我编的程序都只能做一件事情,也就是只有一个线程.多线程的编程就是可以将程序任务分成多个并行的子任务,同时运行,互不干扰.我对多线程的理解是从格斗游戏得来的.格斗游戏中两人对打就是通过两个线程来实现的吧,否则如何能够你出你的招,我发我的冲击波呢.

(1月18日)忽然想到一个问题,补充一下.多线程是不是我们通常所说的多任务呢?我的理解是,不能这样说也可以这样说.
简单说来,多线程提供了一种在进程内部进行多个线程并行调度的机制,而多任务则提供的是在一个操作系统内部运行多个进程的机制.
多任务操作系统(如Windows)的基本原理是这样的:操作系统将CPU的时间片分配给多个线程,每个线程在操作系统指定的时间片内完成(注重,这里的多个线程是分属于不同进程的).操作系统不断的从一个线程的执行切换到另一个线程的执行,如此往复,宏观上看来,就似乎是多个线程在一起执行.由于这多个线程分属于不同的进程,因此在我们看来,就似乎是多个进程在同时执行,这样就实现了多任务.Whoops,真绕口.
如上,多线程和多任务是有很明显的区别的.但是再想一下,在一个应用程序内实现多线程不也是靠CPU分配时间片吗?既然原理是相同的,那么多线程也可以说是多任务的.

一个Java程序启动后,就已经有一个线程在运行,我们可以通过下面的例子来初步建立一个线程的实际印象

class testthread{
public static void main(String args[]){
Thread t=Thread.currentThread();
t.setName("This Thread is running");
System.out.PRintln("The running thead:"+t);
try{
for(int i=0;i<5;i++)
{
System.out.println("Sleep time"+i);
Thread.sleep(1000);//挂起线程,就是让线程休息一会儿,不占用系统资源,因此其它线程可以继续.这里的Thread缺省表示主线程
}
}catch(InterruptedException e){System.out.println("thread has wrong");}
}
}

这只是一个线程,那么我们怎么实现多个线程呢?又怎样让线程做我安排它要做的事情呢?
实现线程体的构造有两种方法.
第一种方法是通过继续构造线程体.
在Java中专门有一个Thread类,这个类里面有一个函数run(),里面记录着线程要完成的操作,就似乎通常所说的主函数main()一样,run()函数运行完了,线程就结束了.通过继续这个类,我们可以定义我们自己的线程,在run函数中告诉它该做什么事情.下面的程序就是继续了一个SimpleThread类,用两个线程来输出HelloWorld.

public class TwoThread{

public static void main(String args[]){
new SimpleThread("HelloWorld1").start();//创建两个线程的实例,就这么简单
new SimpleThread("HelloWorld2").start();
}

}
class SimpleThread extends Thread{ file://真正的内容在这里
public SimpleThread(String str){
super(str);//super代表SimpleThread类的直接父类,这里就是Thread
}

file://我们要线程做的事情都在这里了
public void run(){
for(int i=0;i<10;i++){
System.out.println(i+" "+getName());
try{
sleep((int)(Math.random()*1000));
}catch(InterruptedException e){}
}
System.out.println("Done!"+getName()); 
}
}

运行的结果是两个线程交替显示各自的HelloWorld十次,输出是混在一起的,因为两个线程是同时运行的.

第二种方法是通过启动接口构造线程体.在任意实现了启动接口的类当中,比如下面的twothread类,都可以实现多线程,我所需要做的就是在这个类的定义当中加上一个run函数.例程如下

class TwoThread implements Runnable{
TwoThread(){
Thread t1=Thread.currentThread();
t1.setName("The first main thread");
System.out.println("The running thead:"+t1);
Thread t2=new Thread(this,"the second thread");//注重这里的this,它表明新线程即t2将会做的事情由this对象来决定,也就是由twothread的run函数来决定
System.out.println("create another thread");
t2.start();//调用该函数将使线程从run函数开始执行
try{
System.out.println("first thread will sleep");
Thread.sleep(3000);
}catch(InterruptedException e){System.out.println("first thread has wrong");}
System.out.println("first thread exit");
}

public void run()//定义run()函数,在本程序中也就是t2这个新的线程会做的事情
{
try{
for(int i=0;i<5;i++)
{
System.out.println("sleep time for thread 2:"+i);
Thread.sleep(1000);
}
}catch(InterruptedException e){System.out.println("thread has wrong");}
System.out.println("second thread exit");
}
public static void main(String args[]){
new TwoThread();//触发构造函数
}
}

运行的结果如下:
The running rhread:Thread[The first main thread,5,main]
creat another thread
first thread will sleep
Sleep time for thread 2:0
Sleep time for thread 2:1
Sleep time for thread 2:2
first thread exit
Sleep time for thread 2:3
Sleep time for thread 2:4
second thread exit

扯扯别的.我们注重到很多Java程序开头都有import语句,似乎和C的#include和Delphi的uses很象哦.import是Java的要害词,负责调入包(package).包由一组类和界面组成,是治理大型名字空间,避免名字冲突的工具.
Java提供了很多包供我们使用,主要如下:

java.applet
设计Applet的类

java.awt
窗口工具包,包含了产生GUI元素的类

java.io
文件输入输出类

java.lang
java语言类,包含:对象,线程,异常出口,系统,整数,原点,数字,字符等

java.net
Socket类及与TCP/ip相关的类

java.util
一些程序的同步类

...

晚上粗略的翻看了一下Java类的概念.作为面向对象编程的基本元素,类的思想在Java当中体现的比C++更为突出.不象C++还保持着对面向过程语言的兼容,Java的程序里面只有类,是彻头彻尾的面向对象,举个例子,"hello"这个字府串也是一个对象,我们可以调用"Hello".equalsIgnoreCase()来判定它是否和其它字符串相同.我们通常在C中看到的主程序Main在Java中也要封装到类当中,通过类来引用.

类的基本性质在Java中的体现无非就是重载,继续和多态.重载是指创建名字相同,参数不同的成员函数,是横向的.继续是从祖先类继续变量和成员函数,是纵向的.多态性举例说来,体现在程序的运行当中,实例变量可以根据需要选择以父类的实例出现或以子类的实例出现.

这些东西多写写,给脑袋的刺激会更多些,记得更牢些,免得象上次那样应聘时,主考官问我面向对象的几个性质是什么,我居然都没能够答全,真是奇郁闷啊. 

 以上就是菜鸟初学Java的备忘录(三)的内容,更多相关内容请关注PHP中文网(www.php.cn)! 


声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
是否有任何威胁或增强Java平台独立性的新兴技术?是否有任何威胁或增强Java平台独立性的新兴技术?Apr 24, 2025 am 12:11 AM

新兴技术对Java的平台独立性既有威胁也有增强。1)云计算和容器化技术如Docker增强了Java的平台独立性,但需要优化以适应不同云环境。2)WebAssembly通过GraalVM编译Java代码,扩展了其平台独立性,但需与其他语言竞争性能。

JVM的实现是什么,它们都提供了相同的平台独立性?JVM的实现是什么,它们都提供了相同的平台独立性?Apr 24, 2025 am 12:10 AM

不同JVM实现都能提供平台独立性,但表现略有不同。1.OracleHotSpot和OpenJDKJVM在平台独立性上表现相似,但OpenJDK可能需额外配置。2.IBMJ9JVM在特定操作系统上表现优化。3.GraalVM支持多语言,需额外配置。4.AzulZingJVM需特定平台调整。

平台独立性如何降低发展成本和时间?平台独立性如何降低发展成本和时间?Apr 24, 2025 am 12:08 AM

平台独立性通过在多种操作系统上运行同一套代码,降低开发成本和缩短开发时间。具体表现为:1.减少开发时间,只需维护一套代码;2.降低维护成本,统一测试流程;3.快速迭代和团队协作,简化部署过程。

Java的平台独立性如何促进代码重用?Java的平台独立性如何促进代码重用?Apr 24, 2025 am 12:05 AM

Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

您如何在Java应用程序中对平台特定问题进行故障排除?您如何在Java应用程序中对平台特定问题进行故障排除?Apr 24, 2025 am 12:04 AM

要解决Java应用程序中的平台特定问题,可以采取以下步骤:1.使用Java的System类查看系统属性以了解运行环境。2.利用File类或java.nio.file包处理文件路径。3.根据操作系统条件加载本地库。4.使用VisualVM或JProfiler优化跨平台性能。5.通过Docker容器化确保测试环境与生产环境一致。6.利用GitHubActions在多个平台上进行自动化测试。这些方法有助于有效地解决Java应用程序中的平台特定问题。

JVM中的类加载程序子系统如何促进平台独立性?JVM中的类加载程序子系统如何促进平台独立性?Apr 23, 2025 am 12:14 AM

类加载器通过统一的类文件格式、动态加载、双亲委派模型和平台无关的字节码,确保Java程序在不同平台上的一致性和兼容性,实现平台独立性。

Java编译器会产生特定于平台的代码吗?解释。Java编译器会产生特定于平台的代码吗?解释。Apr 23, 2025 am 12:09 AM

Java编译器生成的代码是平台无关的,但最终执行的代码是平台特定的。1.Java源代码编译成平台无关的字节码。2.JVM将字节码转换为特定平台的机器码,确保跨平台运行但性能可能不同。

JVM如何处理不同操作系统的多线程?JVM如何处理不同操作系统的多线程?Apr 23, 2025 am 12:07 AM

多线程在现代编程中重要,因为它能提高程序的响应性和资源利用率,并处理复杂的并发任务。JVM通过线程映射、调度机制和同步锁机制,在不同操作系统上确保多线程的一致性和高效性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境