志达IT
做快乐程序员

java多线程应用场景(java多线程注意事项)

java多线程应用场景

线程是一个动态执行过程。多线程是一种特殊的多任务处理形式,但多线程使用的资源开销较少。java多线程的使用场景是什么?接下来,让我们解释一下java多线程的使用场景。
最多线程的场景:web服务器本身;各种专用服务器(如游戏服务器);
多线程的常见应用场景:
1.后台任务,如定期向大量用户(超过100w)发送邮件;
2.异步处理,如微博、日志等;
3.分布式计算;
如何创建java多线程?
方法1:继承Thread类
1.创建继承自Thread类的子类
2.重写Thread类中的run():在run()中声明此线程要执行的操作
3.创建线程的子类对象
4.调用该对象的start():①启动线程②调用当前线程的run()方法java
方法2:如何实现Runnable接口
1.创建一个实现Runnable接口的类
2.在Runnable接口中实现抽象方法:run():声明要由该方法中创建的线程执行的操作
3.创建Runnable接口实现类的对象
4.将此对象作为参数传递给线程类的构造函数,以创建线程类的对象
5.在Thread类中调用start():①启动线程②调用线程的run()–>调用Runnable接口实现类的run(
以下两种方法是jdk1.5的新方法!
方法3:实现可调用接口
解释:
1.与使用Runnable相比,Callable更强大
2.与run()方法相比,实现的call()方法可以返回值
3.该方法可以引发异常
4.支持泛型返回值
5.您需要使用FutureTask类,例如获取返回的结果
Future接口可以取消特定Runnable和Callable任务的执行结果,查询它们是否完成,并获取结果。
FutureTask是Futrue接口的唯一实现类
FutureTask还实现了Runnable和Future接口。它可以作为Runnable由线程执行,也可以作为Future来获取Callable的返回值
方法4:使用线程池
解释:
提前创建许多线程,将它们放入线程池,在使用时直接获取它们,并在使用后将它们放回池中。它可以避免频繁的创建、破坏和重用。它与生活中的公共交通类似。
优点:
1.提高响应速度(减少创建新线程的时间)
2.减少资源消耗(重用线程池中的线程,不需要每次都创建它们)
3.促进线程管理

java多线程注意事项

1:继承thread和实现Runnable创建线程的区别:
继承thread创建的对象直接start()就可以就绪,但是使用Runnable所new出来的对象要先newThread(xx)才能start()
这也就意味着在start()之前实现Runnable的类一次new出来的对象是可以多次传入newThread()创建多个线程实例并且多次start()的,就是说
runnable的数据可以被共享,但是继承thread创建的线程不具备这个功能。
classThread1extendsThread{privateintcount=5;privateStringname;publicThread1(Stringname){this.name=name;
}publicvoidrun(){for(inti=0;i<5;i++){
System.out.println(name+”运行count=”+count–);try{
sleep((int)Math.random()*10);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}publicclassMain{publicstaticvoidmain(String[]args){
Thread1mTh1=newThread1(“A”);
Thread1mTh2=newThread1(“B”);
mTh1.start();
mTh2.start();
}
}
2:线程的状态:
|-阻塞-|
||就绪-可运行-运行中-死亡|/|
|/|锁——等待
运行—可运行:thread.yield()
运行–等待:object.wait()
运行–阻塞:thread.sleep()thread.join()
运行–锁:synchronized
等待–锁:object.notify()或者wait时间到
锁–可运行:
3:解析sleep()wait()yield()的区别:
sleepwaityield所属类:ThreadObjectThread
目的:运行到阻塞运行到等待运行到可运行或者立即重新运行
锁持有状态:不释放释放释放
让出cpu资源后:允许比自己优先级低的运行只允许比自己优先级高或等的执行,也可能自己去执行
使用条件:任何地方必须在同步块或者方法中java
4:常用方法
sleep():强迫一个线程睡眠N毫秒。
isAlive():判断一个线程是否存活。
join():等待线程终止。
activeCount():程序中活跃的线程数。
enumerate():枚举程序中的线程。
currentThread():得到当前线程。
isDaemon():一个线程是否为守护线程。
setDaemon():设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)
setName():为线程设置一个名称。
wait():强迫一个线程等待。
notify():通知一个线程继续运行。
setPriority():设置一个线程的优先级。
5:synchronized
a:PublicsynchronizedvoidmethodAAA()//修饰静态方法时锁对象是调用这个方法的对象
{//….
}
b:publicvoidmethod3(SomeObjectso)//修饰块时锁对象是括号中的对象
{
synchronized(so)
{//…..
}
}
c:ClassFoo{publicsynchronizedstaticvoidmethodAAA()//同步的static函数锁对象是当前类
{
}publicvoidmethodBBB()
{
synchronized(Foo.class)//等同于上面
}
}
6:经典例子
publicclassTest{publicclassmyThreadimplementsRunnable{privateStringthreadName;privateObjectpre;privateObjectcurr;publicmyThread(Stringn,Objectp,Objectc){this.threadName=n;this.pre=p;this.curr=c;
}publicvoidrun(){//TODOAuto-generatedmethodstub
inti=10;while(i>0){
synchronized(pre){
synchronized(curr){
System.out.println(threadName);
i–;
curr.notify();//通知下一个对象获得锁
}try{
pre.wait();
}catch(InterruptedExceptione){//TODOAuto-generatedcatchblock
e.printStackTrace();
}//释放对pre对象持有的锁
}
}
}
}publicstaticvoidmain(String[]args){
Objecta=newObject();
Objectb=newObject();
Objectc=newObject();
Testt=newTest();
myThreadpa=t.newmyThread(“A”,c,a);newThread(pa).start();
myThreadpb=t.newmyThread(“B”,a,b);newThread(pb).start();
myThreadpc=t.newmyThread(“C”,b,c);newThread(pc).start();
}
}

赞(0)
未经允许不得转载:志达IT网站 » java多线程应用场景(java多线程注意事项)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

志达IT网站 每天分享编程和互联网的IT技术博客

登录/注册联系我们