对java中的线程感想
1.进程和线程的区别
通俗一点说,进程就是程序的一次执行,而线程可以理解为进程中的执行的一段程序片段。
用一点文词说就是,每个进程都有独立的代码和数据空间(进程上下文);而线程可以看成是轻量级的进程。一般来讲(不使用特殊技术),同一进程所产生的线程共享同一块内存空间。
同一进程中的两段代码是不可能同时执行的,除非引入线程。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程占用的资源要少于进程所占用的资源。
进程和线程都可以有优先级。
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
多进程-----在操作系统中,能同时运行多个任务(程序)。
多线程-----在同一应用程序中,有多个顺序流同时执行。
2.通过铁路售票程序来理解实现多线程的两种方法:通过java.lang.Thread类和通过Runnable接口
java中有两种实现多线程的方式。一是直接继承Thread类,二是实现Runnable接口。那么这两种实现多线程的方式在应用上有什么区别呢?
为了回答这个问题,我们可以通过编写一段代码来进行分析。我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示。
我们首先这样编写这个程序:
public class ThreadDome1{
public static void main(String[] args){
ThreadTest t = new ThreadTest();
t.start();
t.start();
t.start();
t.start();
}
}
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){
System.out.println(Thread.currentThread().getName() +
"is saling ticket" + ticket--);
}else{
break;
}
}
}
}
上面的代码中,我们用ThreadTest类模拟售票处的售票过程,run方法中的每一次循环都将总票数减1,模拟卖出一张车票,同时该车票号打印出来,直接剩余的票数到零为止。在ThreadDemo1类的main方法中,我们创建了一个线程对象,并重复启动四次,希望通过这种方式产生四个线程。从运行的结果来看我们发现其实只有一个线程在运行,这个结果告诉我们:一个线程对象只能启动一个线程,无论你调用多少遍start()方法,结果只有一个线程。
我们接着修改ThreadDemo1,在main方法中创建四个Thread对象:
public class ThreadDemo1{
public static void main(String[] args){
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
}
}
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket" + ticket--);
}else{
break;
}
}
}
}
这下达到目的了吗?
从结果上看每个票号都被打印了四次,即四个线程各自卖各自的100张票,而不去卖共同的100张票。这种情况是怎么造成的呢?我们需要的是,多个线程去处理同一个资源,一个资源只能对应一个对象,在上面的程序中,我们创建了四个ThreadTest对象,就等于创建了四个资源,每个资源都有100张票,每个线程都在独自处理各自的资源。
经过这些实验和分析,可以总结出,要实现这个铁路售票程序,我们只能创建一个资源对象,但要创建多个线程去处理同一个资源对象,并且每个线程上所运行的是相同的程序代码。在回顾一下使用接口编写多线程的过程。
public class ThreadDemo1{
public static void main(String[] args){
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class ThreadTest implements Runnable{
private int tickets = 100;
public void run(){
while(true){
if(tickets > 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket " + tickets--);
}
}
}
}
上面的程序中,创建了四个线程,每个线程调用的是同一个ThreadTest对象中的run()方法,访问的是同一个对象中的变量(tickets)的实例,这个程序满足了我们的需求。在Windows上可以启动多个记事本程序一样,也就是多个进程使用同一个记事本程序代码。
可见,实现Runnable接口相对于继承Thread类来说,有如下显著的好处:
(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。
(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。
(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
文章转载自:http://news.newhua.com/news1/program_net/2009/29/09291444214H0095KI32IIB72BEA9CDG7GFH95729HI19CJ5KCKI133.html
分享到:
相关推荐
通过本实验的学习,加深了对线程与进程概念的理解,并掌握了多线程在Java中的具体实现方法。特别是对临界区、对象锁、互斥与同步等核心概念有了更深入的认识,这对于编写高效、稳定的多线程程序至关重要。 #### 七...
在实际项目开发中,Java 的优势在于其强大的库支持和社区资源,如Spring框架、Hibernate ORM等,这些工具和框架极大地简化了开发流程,提高了开发效率。此外,Java 还提供了丰富的网络编程、数据库操作和并发处理的...
他还建议学生深入学习并发编程,因为多线程是现代软件开发中的常态,理解并发和同步机制有助于写出高效且安全的代码。 在实际项目中,李老师提倡动手实践,认为“实践出真知”。他鼓励学生参与开源项目,通过实际...
通过这五个礼拜的实习,实习生不仅掌握了Java编程的基础和高级知识,也锻炼了实际问题解决能力,对软件开发流程有了初步认识。这为他们后续的学习和职业生涯打下了坚实的基础。在实习过程中,不断挑战自我,适应新...
线程机制使得Java程序能够并行处理任务,提高效率,如在文件自动保存功能中,可以利用Timer类的schedule方法实现定时操作。 Java程序设计不仅涉及编程技术,还涉及到软件工程的实践,如良好的代码组织和类的设计。...
这篇名为“JAVA论文 简易浏览器与JAVA思想”的文档主要涵盖了使用JAVA语言开发一个简易浏览器的实践过程,以及在开发过程中所体现的JAVA编程思想。作者韩公达通过这个项目,深入探讨了JAVA在实际应用中的核心概念,...
3. **听课感想.pdf**:这份文件可能是作者在学习Java过程中对课程或者讲座的个人感悟和理解,包含了对某个主题的深度思考和反馈。通过阅读这样的笔记,我们可以了解作者对Java学习过程中的难点、重点和关键点的理解...
"听课感想.pdf"可能包含的是学习过程中的个人理解和感悟,这在学习过程中非常重要,因为它能帮助我们巩固知识,发现自己的弱点,并从中提炼出实际应用中的技巧和经验。 最后,"study_CoreJava.pdf"很可能是一份详尽...
2. **听课感想.pdf** - 这可能是一位讲师或学生对课程的反馈和思考,可能包含了学习Java GUI编程时遇到的问题、解决方案、理解难点以及个人见解,对于学习者来说是一种宝贵的参考材料。 3. **study_CoreJava.pdf** ...
同时,掌握了Java企业级编程规范,包括代码风格、异常处理、多线程编程等。 - Java面向对象:深入理解类、对象、继承、封装、多态等概念,以及如何使用JDK提供的核心API,如集合框架、IO流、网络编程等。 - 在线考试...
在面试中,Java的数据结构是面试官经常关注的重点,特别是对于有经验的开发者。LinkedList、ArrayList、HashMap 和 TreeMap 是Java集合框架中常见的数据结构,它们各有特点和适用场景。 1. **LinkedList**:...
此外,这个项目还能帮助学习者深化对Java编程语言特性的理解,如I/O流、网络通信和线程管理。 1.2 设计说明 在Java中实现Web服务器,首先需要理解HTTP协议,它是Web服务器和浏览器之间通信的基础。服务器需要解析...
操作系统进程同步和互斥是操作系统中至关重要的概念,它们确保了多进程或多线程环境下的资源有效管理和安全访问。本实验报告详细介绍了如何通过编程实现这一机制,并以生产者-消费者问题为实例进行演示。 实验的...
- 在调试过程中,如果当前线程已经处于某个断点处,使用Resume可以让程序继续运行至下一个断点。 6. **Hit Count**:设置断点时可以指定触发次数,只有达到指定次数后才会暂停。 7. **Inspect**:查看当前变量的值...
Hibernate是Java开发中的一款强大的对象关系映射(ORM)框架,它为开发者提供了一种在Java应用程序中操作数据库的面向对象方式,极大地简化了数据库操作的复杂性。通过使用Hibernate,开发者可以避免直接编写SQL语句...
第三章总结与心得部分,作者可能分享了完成项目后的感想,总结了设计过程中的挑战和解决方案,以及从中学到的网络编程和安全知识。这部分内容有助于读者理解作者的成长和项目的价值。 总的来说,端口扫描程序的设计...
- **实验感想**:分享了通过本次课程设计所学到的知识和技能,以及对未来学习方向的思考。 该项目不仅展示了移动应用开发的基础知识和技术,还涉及到了服务器端开发、数据库管理和软件架构设计等多个方面,是一次...
- 在报告的第16页,团队可能会讨论在开发过程中遇到的挑战,如性能优化、内存管理、线程同步等问题,以及他们如何通过学习和实践找到解决方案。 4. **思考及感想**: - 在第19页,团队成员分享他们的项目经验,...
【描述】:“DailyMomentApp”是一个用Java语言编写的日常记录应用,旨在帮助用户捕捉生活中的点滴时刻,记录日常感想,提供便利的日程管理和提醒功能。这个应用程序可能包含了前端用户界面、后端服务器逻辑以及...