java线程应用
A. java多线程有哪些实际的应用场景
场景一:一个业务逻辑有很多次的循环,每次循环之间没有影响,比如验证1万条url路径是否存在,正常情况要循环1万次,逐个去验证每一条URL,这样效率会很低,假设验证一条需要1分钟,总共就需要1万分钟,有点恐怖。这时可以用多线程,将1万条URL分成50等份,开50个线程,没个线程只需验证200条,这样所有的线程执行完是远小于1万分钟的。
场景二:需要知道一个任务的执行进度,比如我们常看到的进度条,实现方式可以是在任务中加入一个整型属性变量(这样不同方法可以共享),任务执行一定程度就给变量值加1,另外开一个线程按时间间隔不断去访问这个变量,并反馈给用户。
总之使用多线程就是为了充分利用cpu的资源,提高程序执行效率,当你发现一个业务逻辑执行效率特别低,耗时特别长,就可以考虑使用多线程。不过CPU执行哪个线程的时间和顺序是不确定的,即使设置了线程的优先级,因此使用多线程的风险也是比较大的,会出现很多预料不到的问题,一定要多熟悉概念,多构造不同的场景去测试才能够掌握!
我有一个微信公众号,每天都会分享一些Java相关的干货文章,还有一些学习资源。
如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。
B. java线程的用处
一、为什么要研究和使用线程一般来说,计算机正在执行的程序称作进程(process),进程有不同的地址空间并且是在同一系统上运行的不同程序,如WORD和Excel,进程间的通讯是很费时而且有限的。上下文切换、改变运行的进程也是非常复杂的。进程间通讯复杂,可能需要管道、消息队列、共享内存(sharedmemory)或信号处理来保证进程间的通讯。尽管许多程序都在运行,但一次只能与一个程序打交道。线程(thread)是指进程中单一顺序的控制流。又称为轻量级进程。线程则共享相同的地址空间并共同构成一个大的进程。线程间的通讯是非常简单而有效的,上下文切换非常快并且是整个大程序的一部分切换。线程仅是过程调用,它们彼此独立执行,线程使得在一个应用程序中,程序的编写更加自由和丰富。线程的兴趣在于,一个程序中同时使用多个线程来完成不同的任务。因此如果很好地利用线程,可以大大简化应用程序设计。多线程可以增进程序的交互性,提供更好的能力和功能、更好的GUI和更好的服务器功能。给二个例子说明如下:例一:利用多线程并行机制可以很好地解决交互式网络程序中的许多问题,如:大量的网络文件资源的读写、用户输入响应、动画显示等问题不需要CPU的多少时间;而耗时的复杂计算通常并不需要立即响应,所以无需将CPU全给它。例如,从一个慢速的网络上读取一数据流也许要1分钟时间,但需要CPU参与传输数据的时间则非常短;响应用户的输入如击键,就算最快的输入员,1秒钟击键10次,也不需要CPU的多少时间。动画程序比较耗时,一幅画在1秒内要重绘5-10次,但CPU在大部分时间仍处于空闲状态。在传统的单线程环境下的问题是用户必须等待每个任务完成后才能进行下一个任务。即使CPU大部分时间空闲,也只能按步就班地工作。多线程可以很好地解决这些问题避免引起用户的等待。如:耗时的复杂计算应用就可划分成两个控制线程:一个处理GUI的用户事件,另一个进行后台计算。例二:如并发服务器,它面向不定长时间内处理完的请求,对每个请求由服务器的线程处理。传统的并发服务器往往是基于多进程机制的,每个客户一个进程,需要操作系统的干预,进程的数目受操作系统的限制。本文利用Java的线程机制建立了基于多线程的并发服务器。生成和管理他们是相当简单的操作。线程被用来建立请求驱动的服务程序,每个客户一个线程,多个线程可以并发执行。特别地线程具有如下特性(1)线程共享父进程的所有程序和数据(2)有自身的运行单元(3)有它自己的私有存储和执行环境(尤其是处理器寄存器),使得服务器进程不随客户数的增加而线性增加。可减少服务器进程的压力,降低开销,充分利用CPU的资源。以上并发服务器在某一瞬间由同一服务器进程所产生的多个并发线程对多个客户的并发请求采取分而治之的措施,从而解决了并发请求的问题。各线程即可以独立操作,又可以协同作业。降低了服务器的复杂度。Java是基于操作系统级的多线程环境之上设计的,Java的运行器依靠多线程来执行任务,并且所有类库在设计时都考虑到多线程机制。二、线程的应用在实际应用中,线程使用的范围很广,可用于控制实时数据处理、快速的网络服务,还有更快的图象绘制和打印,以及数据库中的数据的取回和处理等等。在Java中一个在不停运行的提供一些基本服务的例子是垃圾收集线程,垃圾收集线程,。该线程由Java虚拟机提供。它扫描程序中不再被访问的变量,将其所占的系统资源释放给系统。参考资料: http://hi..com/%B1%CF%C0%F6%C3%F4/blog/item/7af6954be4afacf283025c10.html
C. 线程在java编程中的作用
线程在java编程中的作用可以实现多个任务同时进行。java创建线程的方式最常用的有两种。
1、第一种是创建Thread子类的一个实例并重写run方法,run方法会在调用start()方法之后被执行。例子如下:
{
publicvoidrun(){
System.out.println("MyThreadrunning");
}
}
MyThreadmyThread=newMyThread();
myTread.start();
2、第二种编写线程执行代码的方式是新建一个实现了java.lang.Runnable接口的类的实例,实例中的方法可以被线程调用。下面给出例子:
{
publicvoidrun(){
System.out.println("MyRunnablerunning");
}
}
Threadthread=newThread(newMyRunnable());
thread.start();
D. 在用java开发程序中什么时候应用到线程
一般 需要独立运行某个东西的时候会用到线程
我用过的就是 端口监听的时候
比如说 你的程序在200端口上 设置另一个监听,当有数据通过这个端口传输的时候 就会被监听程序所获取 但是如何保证 实时监听?这个就需要有个线程独立的 来执行这个工作 保持监听的状态。
再比如说 你需要做一个任务处理的程序 当数据库中有新任务时候就进行处理/或者XX路径下出现新的文件 就进行处理,这个时候 也需要用到线程 来实时扫描数据库或者是文件路径,来保证任务能够得到及时的处理
E. Java线程怎样使用
多进程是指操作系统能同时运行多个任务(程序),多线程是指在同一程序中有多个顺序流在执行。
在java中创建一个线程有两种方法:
packagecom.thread;
publicclassThreadTest1{
publicstaticvoidmain(String[]args){
Runnable1r=newRunnable1();
//r.run();并不是线程开启,而是简单的方法调用
Threadt=newThread(r);//创建线程
//t.run();//如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方法不执行任何操作并返回。
t.start();//线程开启
for(inti=0;i<100;i++){
System.out.println("main:"+i);
}
}
}
{
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println("Thread-----:"+i);
}
}
}
F. java多线程的应用
你的问题是因为线程分配的不确定性,及你的设计思路引起的。
我给你改了两个类,你看一下。
import java.util.ArrayList;
import java.util.List;
public class Storage {
private List<Integer> list = null;
private int index = 0;
public Storage() {
list = new ArrayList<Integer>();
}
public synchronized void setNum(int num) {
list.add(num);
}
public synchronized int GetNum() {
if (index == list.size()) {
return -1;
}
return list.get(index++);
}
}
public class Printer extends Thread {
Storage s;
private int len = 10;
public Printer() {
}
public Printer(String str) {
super(str);
}
public Printer(String str, Storage s, int len) {
super(str);
this.s = s;
this.len = len;
}
public void run() {
int index = 0;
System.out.println("读数器线程开始运行");
while (true) {
synchronized (this) {
int value = s.GetNum();
if (value != -1) {
System.out.println("计数器当前的值为:" + value);
index++;
}
if (index == len) {
break;
}
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("读数器线程结束运行");
}
}
因为线程分配的不确定性,所以打印的结束条件就不能用固定循环来控制。应该其它的条件来终目循环。
取数也一样,存和取的时间顺序都不固定,所以还是放到一个有序的集合中,通过取值索引来取值。
G. Java的线程在项目中一般会有什么具体的应用
java线程在项抄目中的应用场景如下:
场景一:一个业务逻辑有很多次的循环,每次循环之间没有影响,比如验证1万条url路径是否存在,正常情况要循环1万次,逐个去验证每一条URL,这样效率会很低,假设验证一条需要1分钟,总共就需要1万分钟,有点恐怖。这时可以用多线程,将1万条URL分成50等份,开50个线程,没个线程只需验证200条,这样所有的线程执行完是远小于1万分钟的。
场景二:需要知道一个任务的执行进度,比如我们常看到的进度条,实现方式可以是在任务中加入一个整型属性变量(这样不同方法可以共享),任务执行一定程度就给变量值加1,另外开一个线程按时间间隔不断去访问这个变量,并反馈给用户。
总之使用多线程就是为了充分利用cpu的资源,提高程序执行效率,当你发现一个业务逻辑执行效率特别低,耗时特别长,就可以考虑使用多线程。不过CPU执行哪个线程的时间和顺序是不确定的,即使设置了线程的优先级,因此使用多线程的风险也是比较大的,会出现很多预料不到的问题,一定要多熟悉概念,多构造不同的场景去测试才能够掌握!
H. javaWeb中多线程具体应用到什么地方、怎么应用
在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。
I. 线程应用-java小作业
1、创建一个动物集合,插入动物园中有的几种动物(请给出10种)
2、一次性输出内容
3、使用iterator遍历集合中所有内容
4、将集合内容转存储于一个数字内,并在数组中进行排序
只列举了2种动物,自己再添加
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.Collection;
importjava.util.Iterator;
/**
*
*@authorAdministrator
*/
interfaceAnimal{
publicStringtoString();
}
classCatimplementsAnimal,Comparable<Animal>{
publicStringname;
publicCat(){
super();
name="猫";
}
publicStringtoString(){
returnname;
}
@Override
publicintcompareTo(Animalo){
if(this.toString().compareTo(o.toString())==-1){
return-1;
}elseif(this.toString().compareTo(o.toString())==0){
return0;
}else
return1;
}
}
classDogimplementsAnimal,Comparable<Animal>{
publicStringname;
publicDog(){
super();
name="狗";
}
publicStringtoString(){
returnname;
}
@Override
publicintcompareTo(Animalo){
if(this.toString().compareTo(o.toString())==-1){
return-1;
}elseif(this.toString().compareTo(o.toString())==0){
return0;
}else
return1;
}
}
publicclassDemo8{
publicstaticvoidmain(String[]args){
//创建一个动物集合,插入动物园中有的几种动物
Collection<Animal>col=newArrayList<Animal>();
col.add(newCat());
col.add(newDog());
col.add(newCat());
//一次性输出内容
System.out.println(Arrays.toString(col.toArray()));
//使用iterator遍历集合中所有内容
//并将集合内容转存储于一个数组内
Iterator<Animal>it=col.iterator();
intn=0;
Animal[]an=newAnimal[3];
while(it.hasNext()){
Animaltemp=(Animal)it.next();
System.out.println("使用iterator遍历集合中所有内容:"+temp);
an[n++]=temp;
}
//并在数组中进行排序
Arrays.sort(an);
System.out.println(Arrays.toString(an));
}
J. 线程在Java Web项目中有哪些应用
首先对java的线程类Thread来进行说明:
Thread是针对是java其本身所具有的,但并不能说其没有调用操作版系统,其最底层的时间片权调度是按照操作系统来执行的。
Thread下可以创建Thread,2个Thread在一定条件下也可以相互调用。
根据以上特点可以总结认为java中的线程能让高级程序员更好的对庞大和复杂的数据流进行拆分,重组从而减低各个环节性能需求,通过增加各项负荷达到系统资源分配的最优值。
举个例子:一个程序需要需要一个2.0GHZ的CPU,占用10%的CPU使用1小时才能得出结果,最差方案就是用1小时。但有了线程使用多线程,在假设所有线程都可以并发执行的前提下我可以使用,10个线程让CPU利用率达到100%,这时我只要6分钟就可以有结果,虽然这些结果分散在10个不同的线程内,我可以再得到10个结果后对10个结果进行处理,得出最终结果,无论从时间维度还是CPU使用率维度,使用多线程是最优解。