「java程序设计多线程」java 实现多线程
本篇文章给大家谈谈java程序设计多线程,以及java 实现多线程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、什么是Java多线程编程?
- 2、多线程的java 程序如何编写?
- 3、北大青鸟设计培训:Java多线程问题总结?
- 4、北大青鸟java培训:java多线程编程中涉及的基础知识点?
- 5、关于Java多线程
什么是Java多线程编程?
一、 什么是多线程:
我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。
多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源)
多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源;
主线程:在进程中至少存在一个主线程,其他子线程都由主线程开启,主线程不一定在其他线程结束后结束,有可能在其他线程结束前结束。Java中的主线程是main线程,是Java的main函数;
二、 Java中实现多线程的方式:
继承Thread类来实现多线程:
当我们自定义的类继承Thread类后,该类就为一个线程类,该类为一个独立的执行单元,线程代码必须编写在run()方法中,run方法是由Thread类定义,我们自己写的线程类必须重写run方法。
run方法中定义的代码为线程代码,但run方法不能直接调用,如果直接调用并没有开启新的线程而是将run方法交给调用的线程执行
要开启新的线程需要调用Thread类的start()方法,该方法自动开启一个新的线程并自动执行run方法中的内容
请点击输入图片描述
结果:
请点击输入图片描述
java多线程的启动顺序不一定是线程执行的顺序,各个线程之间是抢占CPU资源执行的,所有有可能出现与启动顺序不一致的情况。
CPU的调用策略:
如何使用CPU资源是由操作系统来决定的,但操作系统只能决定CPU的使用策略不能控制实际获得CPU执行权的程序。
线程执行有两种方式:
1.抢占式:
目前PC机中使用最多的一种方式,线程抢占CPU的执行权,当一个线程抢到CPU的资源后并不是一直执行到此线程执行结束,而是执行一个时间片后让出CPU资源,此时同其他线程再次抢占CPU资源获得执行权。
2.轮循式;
每个线程执行固定的时间片后让出CPU资源,以此循环执行每个线程执行相同的时间片后让出CPU资源交给下一个线程执行。
希望对您有所帮助!~
多线程的java 程序如何编写?
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
新建状态:
使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
就绪状态:
当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
运行状态:
如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
阻塞状态:
如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:
等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
死亡状态:
一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。
北大青鸟设计培训:Java多线程问题总结?
Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。
java课程培训机构认为这篇文章主要是对多线程的问题进行总结的,因此罗列了多个多线程的问题。
这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。
(1)发挥多核CPU的优势随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。
单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了。
多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。
(2)防止阻塞从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。
但是单核CPU我们还是要应用多线程,就是为了防止阻塞。
试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。
多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。
(3)便于建模这是另外一个没有这么明显的优点了。
假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。
但是如果把这个大的任务A分解成几个小任务,任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。
北大青鸟java培训:java多线程编程中涉及的基础知识点?
线程设计在软件开发领域中是非常常见的一个设计构成,今天湖南北大青鸟就一起来了解一下,java多线程编程中都涉及到了哪些基础知识点。
顺序用于表示多个操作“依次处理”。
比如把十个操作交给一个人来处理时,这个人要一个一个地按顺序来处理并行用于标识多个操作“同时处理”。
比如十个操作分给两个人处理时,这两个人就会并行来处理。
并发相对于顺序和并行来说比较抽象,用于表示“将一个操作分割成多个部分并且允许无序处理”。
比如将十个操作分成相对独立的两类,这样便能够开始并发处理了。
如果一个人来处理,这个人就是顺序处理分开的并发操作,而如果是两个人,这两个人就可以并行处理同一个操作。
总结多线程程序都是并发处理的。
如果CPU只有一个,那么并发处理就是顺序执行的,而如果有多个CPU,那么并发处理就可能会并行运行。
等待队列所有实例都拥有一个等待队列,它是在实例的wait方法执行后停止操作的线程队列。
就好比为每个实例准备的线程休息室在执行wait方法后,线程便会暂停操作,进入等待队列这个休息室。
除非发生下列某一情况,否则线程会一直在等待队列中休眠。
有其他线程的notify方法来唤醒线程有其他线程的notifyAll方法来唤醒线程有其他线程的interrupt方法来唤醒线程wait方法超时notify方法该方法会将等待队列中的一个线程去除。
同wait方法一样,若要执行notify方法,线程也必须持有要调用的实例的锁。
notifyAll方法notify方法仅唤醒一个线程,而notifyAll则唤醒所有线程,这是两者之间的区别同wait方法和notify方法一样,notifyAll方法也只能由持有要调用的实例锁的线程调用notify和notifyAll选择notify方法和notifyAll方法非常相似,到底该使用哪个?实际上,这很难选择,由于notify唤醒的线程较少,所以处理速度要比使用notifyAll时快。
但使用notify时,如果处理不好,程序便可能会停止。
一般来说,使用notifyAll时的代码要比使用notify时的更为健壮。
关于Java多线程
分类: 电脑/网络 程序设计 其他编程语言
问题描述:
import java.awt.*;
import java.applet.*;
public class jex extends Applet implements Runnable
{
Thread th1=null;
String Message="Java now~";
Font f=new Font("TimesRoman",Font.BOLD,24);
int x,y;
public void init()
{
x=getSize().width;
y=getSize().height/2;
}
public void start()
{
if(th1==null)
{
th1=new Thread(this);
th1.start();
}
}
public void run()
{
while(true)
{
x=x-5;
if(x=0) x=getSize().width;
repaint();
try {th1.sleep(100);}
catch(InterruptedException e){}
}
}
public void paint(Graphics g)
{
g.setFont(f);
g.drawString(Message,x,y);
}
}
关于这程序中的几个细节:
while(true) true判断的是什么
th1=new Thread(this); this只什么,书上说是指定对象target的run()方法,不明白这句话--是说不明白this这个方法的作用和用处。
为什么把void start()里的东西放到paint里面不行或者是我做错了,我把 th1=new Thread(this);
th1.start();放到paint()里面后message飞速的动。
把init可不可以放到paint里去啊
init和start是不是thread的方法或者是什么?。
解析:
true是boolean类型的量,为恒真,所以while(true)是一个死循环,如果需要退出循环就要在while(true){}的大括号里加入break语句了。这里是为了循环的出现字符串“Java now~”。
this 是指这个类本身,也就是jex类,因为类Thread为构造方法里有Thread(Runnable r),而jex类本身实现了Runnable接口,所以th1 = new Thread(this)可以用来生一个成新的线程。
你写的这个类是Applet的子类,做为一个小应用程序都会的init(),start(),paint(),stop(), destroy()这些方法,如果没有写出,说明直接继承了父类Applet,这些方法都是不可缺少的。所以如果你把它们随便放的话,就会出现问题。
关于java程序设计多线程和java 实现多线程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-23,除非注明,否则均为
原创文章,转载请注明出处。