Ⅰ java 多线程有几种实现方法
1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
[java] view plain
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
在合适的地方启动线程如下:
[java] view plain
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();
2、实现Runnable接口方式实现多线程
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
[java] view plain
public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}
为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:
[java] view plain
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:
[java] view plain
public void run() {
if (target != null) {
target.run();
}
}
3、使用ExecutorService、Callable、Future实现有返回结果的多线程
ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用。
Ⅱ java多线程如何创建多个多线程
Java 多线程的同步依靠的是对象锁机制,这个问题需要我们不断的学习相关的问题。下面我们就来详细的学习下如何才能更好的进行具体内容的使用。synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问。
下面以一个简单的实例来进行对比分析。实例要完成的工作非常简单,就是创建10个线程,每个线程都打印从0到99这100个数字,我们希望线程之间不会出现交叉乱序打印,而是顺序地打印。
先来看第一段代码,这里我们在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,但结果并不如我们希望那样,这是因为这里synchronized锁住的是this对象,即当前运行线程对象本身。 Java 多线程代码中创建了10个线程,而每个线程都持有this对象的对象锁,这不能实现线程的同步。
Java多线程代码如下
1.package com.vista;
2.class MyThread implements java.lang.Runnable
3.{
4.private int threadId;
5.public MyThread(int id)
6.{
7.this.threadId = id;
8.}
9.@Override
10.public synchronized void run()
11.{
12.for (int i = 0; i < 100; ++i)
13.{
14.System.out.println("Thread ID: " + this.threadId + " : " + i);
15.}
16.}
17.}
18.public class ThreadDemo
19.{
20./**
21.* @param args
22.* @throws InterruptedException
23.*/
24.public static void main(String[] args) throws InterruptedException
25.{
26.for (int i = 0; i < 10; ++i)
27.{
28.new Thread(new MyThread(i)).start();
29.Thread.sleep(1);
30.}
31.}
32.}
以上就是对Java多线程的详细代码介绍。
Ⅲ 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中实现runnable接口多线程技术,用五个线程,生成100个1到1000的随机数
在Java中,使用Runnable接口实现多线程技术,可以有效提高程序的并发处理能力。下面是一个简单的例子,通过创建五个线程,每个线程生成1到1000之间的随机数。
我们定义了一个名为Main的类,其中包含一个静态变量num,用于计数随机数的生成次数。在main方法中,我们创建了五个Thread对象,每个线程实例化了RandomRunnable类的一个实例,并启动了它们。
RandomRunnable类实现了Runnable接口,拥有一个名为name的字符串变量和一个run方法。run方法中包含了生成随机数的逻辑。通过调用Main类的add方法,每个线程可以向控制台输出随机数。
Main类中定义了add方法,用于在控制台打印随机数。add方法中使用了synchronized关键字,确保在同一时间只有一个线程能够访问和修改num变量,避免了线程间的数据竞争。
此外,我们还定义了getNum方法,用于获取当前的计数值。通过这种方式,每个线程可以判断是否需要生成新的随机数。
通过这种方式,我们可以有效地利用多线程技术,在多个线程之间分配任务,提高程序的执行效率。
需要注意的是,虽然这个例子展示了如何使用Runnable接口创建多线程,但实际应用中还需要考虑线程安全和其他并发问题,以确保程序的稳定性和可靠性。
通过这个简单的例子,我们可以了解如何使用Java的多线程技术,实现并发程序设计。希望这个例子能够帮助大家更好地理解和应用多线程编程。
在实际开发过程中,我们还可以通过增加更多的线程或者优化算法来进一步提高程序的并发性能。同时,还需要注意线程之间的通信和同步问题,以确保程序的正确性和高效性。
总之,Java中的多线程技术为程序开发提供了强大的支持。通过合理地设计和实现多线程程序,我们可以充分利用计算机的多核处理能力,提高程序的运行效率。
最后,希望这个例子能够为大家提供一些启示和帮助。如果有任何问题或者需要进一步的帮助,请随时提问。谢谢大家!
Ⅳ Java涓鍏充簬濡备綍瀹炵幇澶氱嚎绋嬫秷鎭阒熷垪镄勫疄渚(java澶氱嚎绋嬮氢俊)
java涓镄勬秷鎭阒熷垪
娑堟伅阒熷垪鏄绾跨▼闂撮氲镄勬坠娈碉细
importjava.util.*
publicclassMsgQueue{
privateVectorqueue=null;
publicMsgQueue(){
queue=newVector();
}
publicvoidsend(Objecto)
{
queue.addElement(o);
}
publicObjectrecv()
{
if(queue.size()==0)
returnnull;
Objecto=queue.();
queue.(0);//orqueue[0]=nullcanalsowork
returno;
}
}
锲犱负java涓鏄痩ockedbyobject镄勬墍浠ユ坊锷犲氨鍙浠ョ敤浜庣嚎绋嫔悓姝ラ挛瀹氩硅薄
鍙浠ヤ綔涓哄氱嚎绋嫔勭悊澶氢换锷$殑瀛樻斁task镄勯槦鍒椼备粬镄刢lient鍖呮嫭灏佽呭ソ镄则ask绫讳互鍙妕hread绫
Java镄勫氱嚎绋-绾跨▼闂寸殑阃氢俊2009-08-2521:58
1.绾跨▼镄勫嚑绉岖姸镐
绾跨▼链夊洓绉岖姸镐侊纴浠讳綍涓涓绾跨▼镶瀹氩勪簬杩椤洓绉岖姸镐佷腑镄勪竴绉嶏细
1)浜х敓锛圢ew锛夛细绾跨▼瀵硅薄宸茬粡浜х敓锛屼絾灏氭湭琚钖锷锛屾墍浠ユ棤娉曟墽琛屻傚傞氲繃new浜х敓浜嗕竴涓绾跨▼瀵硅薄钖庢病瀵瑰畠璋幂敤start()鍑芥暟涔嫔墠銆
2)鍙镓ц岋纸Runnable锛夛细姣忎釜鏀鎸佸氱嚎绋嬬殑绯荤粺閮芥湁涓涓鎺掔▼鍣锛屾帓绋嫔櫒浼氢粠绾跨▼姹犱腑阃夋嫨涓涓绾跨▼骞跺惎锷ㄥ畠銆傚綋涓涓绾跨▼澶勪簬鍙镓ц岀姸镐佹椂锛岃〃绀哄畠鍙鑳芥e勪簬绾跨▼姹犱腑绛夊緟鎺掓帓绋嫔櫒钖锷ㄥ畠锛涗篃鍙鑳藉畠宸叉e湪镓ц屻傚傛墽琛屼简涓涓绾跨▼瀵硅薄镄剆tart()鏂规硶钖庯纴绾跨▼灏卞勪簬鍙镓ц岀姸镐侊纴浣嗘樉钥屾槗瑙佺殑鏄姝ゆ椂绾跨▼涓崭竴瀹氭e湪镓ц屼腑銆
3)姝讳骸锛图ead锛夛细褰扑竴涓绾跨▼姝e父缁撴潫锛屽畠渚垮勪簬姝讳骸鐘舵併傚备竴涓绾跨▼镄剅un()鍑芥暟镓ц屽畬姣曞悗绾跨▼灏辫繘鍏ユ讳骸鐘舵併
4)锅沧粸锛圔locked锛夛细褰扑竴涓绾跨▼澶勪簬锅沧粸鐘舵佹椂锛岀郴缁熸帓绋嫔櫒灏变细蹇界暐瀹冿纴涓嶅瑰畠杩涜屾帓绋嬨傚綋澶勪簬锅沧粸鐘舵佺殑绾跨▼閲嶆柊锲炲埌鍙镓ц岀姸镐佹椂锛屽畠链夊彲鑳介吨鏂版墽琛屻傚傞氲繃瀵逛竴涓绾跨▼璋幂敤wait()鍑芥暟钖庯纴绾跨▼灏辫繘鍏ュ仠婊炵姸镐侊纴鍙链夊綋涓ゆ″硅ョ嚎绋嬭皟鐢╪otify鎴杗otifyAll钖庡畠镓嶈兘涓ゆ″洖鍒板彲镓ц岀姸镐併
2.classThread涓嬬殑甯哥敤鍑芥暟鍑芥暟
2.1suspend()銆乺esume()
1)阃氲繃suspend()鍑芥暟锛屽彲浣跨嚎绋嬭繘鍏ュ仠婊炵姸镐併傞氲繃suspend()浣跨嚎绋嬭繘鍏ュ仠婊炵姸镐佸悗锛岄櫎闱炴敹鍒皉esume()娑堟伅锛屽惁鍒栾ョ嚎绋嬩笉浼氩彉锲炲彲镓ц岀姸镐併
2)褰撹皟鐢╯uspend()鍑芥暟钖庯纴绾跨▼涓崭细閲婃斁瀹幂殑钬滈挛镙囧织钬濄
渚11锛
classextendsThread{
publicstaticintshareVar=0;
public(Stringname){
super(name);
}
publicvoidrun(){
if(shareVar==0){
for(inti=0;i<5;i){
shareVar;
if(shareVar==5){
this.suspend();//锛1锛
}}}
else{
System.out.print(Thread.().getName());
System.out.println("shareVar="shareVar);
this.resume();//锛2锛
}}
}
publicclassTestThread{
publicstaticvoidmain(String[]args){
t1=new("t1");
t2=new("t2");
t1.start();//锛5锛
//t1.start();//锛3锛
t2.start();//锛4锛
}}