java多线程是怎么回事?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程是怎么回事?相关的知识,希望对你有一定的参考价值。

进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。所以线程是轻量级的任务,它们之间的通信和转换只需要较小的系统开销。
Java支持多线程编程,因此用Java编写的应用程序可以同时执行多个任务。Java的多线程机制使用起来非常方便,用户只需关注程序细节的实现,而不用担心后台的多任务系统。
Java语言里,线程表现为线程类。Thread线程类封装了所有需要的线程操作控制。在设计程序时,必须很清晰地区分开线程对象和运行线程,可以将线程对象看作是运行线程的控制面板。在线程对象里有很多方法来控制一个线程是否运行,睡眠,挂起或停止。线程类是控制线程行为的唯一的手段。一旦一个Java程序启动后,就已经有一个线程在运行。可通过调用Thread.currentThread方法来查看当前运行的是哪一个线程。

class ThreadTest
public static void main(String args[])
Thread t = Thread.currentThread();
t.setName("单线程"); //对线程取名为"单线程"
t.setPriority(8);
//设置线程优先级为8,最高为10,最低为1,默认为5
System.out.println("The running thread: " + t);
// 显示线程信息
try
for(int i=0;i<3;i++)
System.out.println("Sleep time " + i);
Thread.sleep(100); // 睡眠100毫秒

catch(InterruptedException e)// 捕获异常
System.out.println("thread has wrong");




多线程的实现方法
继承Thread类
可通过继承Thread类并重写其中的run()方法来定义线程体以实现线程的具体行为,然后创建该子类的对象以创建线程。
在继承Thread类的子类ThreadSubclassName中重写run()方法来定义线程体的一般格式为:
public class ThreadSubclassName extends Thread
public ThreadSubclassName()
..... // 编写子类的构造方法,可缺省

public void run()
..... // 编写自己的线程代码


用定义的线程子类ThreadSubclassName创建线程对象的一般格式为:
ThreadSubclassName ThreadObject =
new ThreadSubclassName();
然后,就可启动该线程对象表示的线程:
ThreadObject.start(); //启动线程

应用继承类Thread的方法实现多线程的程序。本程序创建了三个单独的线程,它们分别打印自己的“Hello World!”。
class ThreadDemo extends Thread
private String whoami;
private int delay;
public ThreadDemo(String s,int d)
whoami=s;
delay=d;

public void run()
try
sleep(delay);
catch(InterruptedException e)
System.out.println("Hello World!" + whoami
+ " " + delay);


public class MultiThread
public static void main(String args[])
ThreadDemo t1,t2,t3;
t1 = new ThreadDemo("Thread1",
(int)(Math.random()*2000));
t2 = new ThreadDemo("Thread2",
(int)(Math.random()*2000));
t3 = new ThreadDemo("Thread3",
(int)(Math.random()*2000));
t1.start();
t2.start();
t3.start();



实现Runnable接口
编写多线程程序的另一种的方法是实现Runnable接口。在一个类中实现Runnable接口(以后称实现Runnable接口的类为Runnable类),并在该类中定义run()方法,然后用带有Runnable参数的Thread类构造方法创建线程。
创建线程对象可用下面的两个步骤来完成:
(1)生成Runnable类ClassName的对象
ClassName RunnableObject = new ClassName();
(2)用带有Runnable参数的Thread类构造方法创建线程对象。新创建的线程的指针将指向Runnable类的实例。用该Runnable类的实例为线程提供 run()方法---线程体。
Thread ThreadObject = new Thread(RunnableObject);
然后,就可启动线程对象ThreadObject表示的线程:
ThreadObject.start();
在Thread类中带有Runnable接口的构造方法有:
public Thread(Runnable target);
public Thread(Runnable target, String name);
public Thread(String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group,Runnable target,
String name);
其中,参数Runnable target表示该线程执行时运行target的run()方法,String name以指定名字构造线程,ThreadGroup group表示创建线程组。
用Runnable接口实现的多线程。
class TwoThread implements Runnable
TwoThread()
Thread t1 = Thread.currentThread();
t1.setName("第一主线程");
System.out.println("正在运行的线程: " + t1);
Thread t2 = new Thread(this,"第二线程");
System.out.println("创建第二线程");
t2.start();
try
System.out.println("第一线程休眠");
Thread.sleep(3000);
catch(InterruptedException e)
System.out.println("第一线程有错");

System.out.println("第一线程退出");

public void run()
try
for(int i = 0;i < 5;i++)
System.out.println(“第二线程的休眠时间:”
+ i);
Thread.sleep(1000);

catch(InterruptedException e)
System.out.println("线程有错");

System.out.println("第二线程退出");

public static void main(String args[])
new TwoThread();


程序运行结果如下:
正在运行的线程: Thread[第一主线程,5,main
创建第二线程
第一线程休眠
第二线程的休眠时间:0
第二线程的休眠时间:1
第二线程的休眠时间:2
第一线程退出
第二线程的休眠时间:3
第二线程的休眠时间:4
第二线程退出
参考技术A 操作系统会为每个执行的程序分配一定Cpu,也就是你在资源管理器看到的进程。而每个进程都会至少有一个线程,也有进程有几个线程。系统执行有多进程的程序时,其实分配的CPU在每个进程之间来回摆动,一会儿执行A进程,一会儿执行B进程。进程分配的是CPU的时间,而进程则是分配CPU资源。 参考技术B 以下全为个人理解,一个字一个字写哒
1.形象的比喻:
任何编程语言中,如JAVA
System.out.println("第一个线程");
System.out.println("第二个线程");
System.out.println("第三个线程");
普通的方法,这3行都是有顺序的,从上到下运行。

而如果使用多线程(代码较多,不贴出来了),那么以上3行可以同时运行,无须一行一行地排队运行。

2.官方的概念
在SUN的JAVA Tutorial中,多线程是Concurrency中的Multi-Threading(Thread翻译过来是线程)。Thread,象Process,但不同于Process(Process为程式,在ctrl+alt+del出来的任务管理器里的程序全属于Process)。Process费内存,费CPU等资源,而Thread可以说是轻量级的Process。一个Process里至少有一个Thread,可能有多个Thread。

3.实际应用
一个有Client-Server Model(客户端-服务器)的程序。服务器跟一个客户交流的时候,可能要花很常时间(如用户登陆,要费时间去查数据库)。难道让其它客户全都去等着?不行。所以为每个客户准备一个Thread,所有客户就可以同时跟服务器交流,互不干扰。

4.难题
Thread有利弊。线程在应用中,会有诸多问题,编程者必须注意。如:Thread Interference (两个线程互相干预)
Memory Consistency Errors (内存不一致)
Deadlock (死锁)
Starvation and Livelock (活琐)
这些都有解决方法,代码带多,不贴了,看参考资料吧!

以上是关于java多线程是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章

深入聊聊Java多线程

java题目运行超时是怎么回事

java编程:java的多线程是怎么实现的?高手进吧

java线程方面的知识

java 程序中怎么保证多线程的运行安全?

java 程序中怎么保证多线程的运行安全?