java多线程知识点
1.Java线程知识有哪些
一般来说,我们把正在计算机中执行的程序叫做"进程"(Process) ,而不将其称为程序(Program)。
所谓"线程"(Thread),是"进程"中某个单一顺序的控制流。新兴的操作系统,如Mac,Windows NT,Windows 95等,大多采用多线程的概念,把线 程视为基本执行单位。
线程也是Java中的相当重要的组成部分之一。 甚至最简单的Applet也是由多个线程来完成的。
在Java中, 任何一个Applet的paint()和update()方法都是由AWT(Abstract Window Toolkit)绘图与事件处理线程调用的,而Applet 主要的里程碑方法——init(),start(),stop()和destory() ——是由执行该Applet的应用调用的。 单线程的概念没有什么新的地方,真正有趣的是在一个程序中同时使用多个线程来完成不同的任务。
某些地方用轻量进程(Lightweig ht Process)来代替线程,线程与真正进程的相似性在于它们都是单一顺序控制流。然而线程被认为轻量是由于它运行于整个程序的上下文内,能使用整个程序共有的资源和程序环境。
作为单一顺序控制流,在运行的程序内线程必须拥有一些资源作为必要的开销。例如,必须有执行堆栈和程序计数器在线程内执行的代码只在它的上下文中起作用,因此某些地方用"执行上下文"来代替"线程"。
线程属性 为了正确有效地使用线程,必须理解线程的各个方面并了解Java 实时系统。 必须知道如何提供线程体、线程的生命周期、实时系统如何调度线程、线程组、什么是幽灵线程(Demo nThread)。
2.学习java多线程,这必须搞懂的这几个概念,很重要
看你上面描述的情况来分析:
首先,你能看懂,能理解,说明你学习能力没问题。
其次,从你能给别人讲解某个知识点可以看出你的表达能力也没问题。
最后,你的学习方法也没错,有些关键的东西是应该做笔记,这样可以加深理解,所以学习方法也没有问题。
回到你的问题上来,你能学会,但是复习时看不懂笔记,这种情况有两种可能:
1.你当时学得时候并不是真的理解,而只是被动的接受了。所以后来复习时你依然是不理解,所以看不懂。
2.你当时确实理解了,清楚地明白了原理。但是你没有动手实践,就是说你只是知道了结论,而没有动手去验证,所以时间一久你又忘记了。
综合上面的情况,你自己可以找到解决方法,如果是第一种,那说明你还是要加强学习,锻炼你的学习能力,如果是第二种,那就很好办了,只要多动手练习就好了,学了之后一定要动手做一遍,那样才算真的学会了。
3.怎么能更快的掌握java多线程知识,并且谁有好的例子
多线程了思想就是让程序同时作事,相当于没有多线程就是一个人做完一件事再作另一件,现在是三个人同时作三件事。
所以问题来了:
1、如果三个人同时扫地,只有一把扫把,那还是只有一个人可以作,一个扫完了另一个人再开始。这时跟单线程没有多少区别了,这就是资源冲突。
2、而如果这个资源是可以修改的,就要进行同步了,不让同时操作,不然你改我也改,都不知道最终结果是谁的了。
3、如果同步不好,比如把地要扫把和水桶才能干活,但一个人抢了扫把,一个人抢了水桶,谁都想抢对方的东西,但谁都不让,这样大家都干不成了,就成了死锁。
所以你要学多线程就是要搞明白什么时候会有资源冲突,冲突时要怎么处理(也就是各种同步方法),线程这块很粗像,主要是概念你要清楚。
4.java中多线程是什么
Java语言中有一个重要的特性是支持多线程。
多线程是java的一项高级技术,它涉及到操作系统里面的知识,层次贴近系统层面。对于普通程序员一般很少碰它。
而且目前就是在java EE(原来的J2EE)的相关框架里,对线程这个东西都是尽量回避。程序员最理想的状态是专注业务逻辑,而不是天天想着线程这个东西怎么写。
思考一个问题程序的本质是什么?是CPU的指令序列的集合。到底什么顺序是程序员编写的让计算机赋值,它就赋值、写个循环它就循环、写个分支语句它就分支、写个跳转它就跳转。
每个指令流就是一个线程,并发执行多个指令流就是多线程。大家想,只有一个CPU怎么可能同时发出多个指令流呢?是的,并发只是“逻辑”上的,物理上是不可能的除非是两个以上的CPU。
多线程和传统的单线程的区别是由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,出现了并发访问带来的一切问题。正像是三个和尚的故事,和尚多了未必是好事。
也就是刚才说的,程序员一般都不让他们碰这个东西。 在java中如何写线程呢,在java中就是很简单了。
有两种方法:第 一、继承java。lang。
Thread第 二、实现Runnable接口。 实践://继承Thread而重写了run()方法public class Hello extends Thread{ int i; public void run(){ while(true){ System。
out。println("Hello "+i++); if(i==10) break; }}}public class HelloThread { public static void main(String[] args){ Hello h1 = new Hello(); Hello h2 = new Hello(); h1。
start(); //用两个线程执行那10次循环 h2。start();}} 上面的例子是第一种方法,下面是第二种方法public class TestThread { public static void main(String args[]) { Xyz r = new Xyz(); Xyz r1 = new Xyz(); Thread t1 = new Thread(r); Thread t2 = new Thread(r1); t1。
start();//用两个线程执行那50次循环 t2。start(); }} //实现Runnable接口class Xyz implements Runnable { int i; public void run() { i = 0; while (true) { System。
out。println("Hello " + i++); if ( i == 50 ) { break;}}}} 上面两种方法继承Thread类,是比较简单的,代码也比较少。
但是我们不提倡使用这种方法。而第二种实现Runnable接口,更符合面向对象思想,Thread是把虚拟的CPU看成一个对象,封装了CPU的细节。
但是Thread的构造线程的子类的方法中与CPU不相关,没有必要把CPU的细节都继承来。而实现Runnable则不影响java。
lang。Thread的体系。
而且便于其它类的继承。 线程并发的代码和数据的执行顺序混乱,我们也需要自己调度和控制它们。
请看附加教程,线程调度和并发。