java中线程的基本操作!
来源:互联网 发布:清华大学软件学院考研 编辑:程序博客网 时间:2024/05/24 00:19
1.继承Thread
public class MyThread extends Thread{public MyThread(String name){ super(name);}int i; public void run(){ for(i=0;i<5;i++){ System.out.println(getName()+"--"+i); } } public static void main(String[] agrs){ new MyThread("线程1").start(); new MyThread("线程2").start(); }}
如上,java中的线程对象必须一个类的形式创建,而该类中必须重写基类的run()方法,该方法其实就是线程的执行体。调用该类实例的start方法则就隐式的调用了run方法。
以上程序输出
线程1--0
线程1--1
线程1--2
线程1--3
线程1--4
线程2--0
线程2--1
线程2--2
线程2--3
线程2--4
不难看出,由于new了2次MyThread,所以两次的实例是不同的,即各自都有各自的i变量,相互独立。
2.实现Runnable接口
public class MyRunnable implements Runnable{ int i; public void run(){ for(i=0;i<50;i++){ System.out.println(Thread.currentThread().getName()+"--"+i);//不能直接this.getName() } } public static void main(String[] agrs){ MyRunnable myRun=new MyRunnable(); new Thread(myRun,"线程1").start(); new Thread(myRun,"线程2").start(); }}
输出
线程1--0
线程1--1
线程2--0
线程2--3
线程2--4
线程2--5
线程2--6
线程2--7
线程2--8
线程2--9
线程2--10
线程2--11
线程2--12
线程2--13
线程2--14
线程2--15
线程1--2
线程2--16
线程2--18
线程2--19
线程2--20
线程2--21
线程2--22
线程2--23
线程2--24
线程1--17
线程2--25
线程1--26
线程2--27
线程1--28
线程1--30
线程2--29
线程1--31
线程2--32
线程2--34
线程2--35
线程2--36
线程2--37
线程1--33
线程2--38
线程1--39
线程1--41
线程2--40
线程1--42
线程1--44
线程1--45
线程2--43
线程1--46
线程2--47
线程2--49
线程1--48
可以看出,由于实现这种方式是将某一个对象做为target加载到Thread类上,所以即使new再多的Thread对象,只要target是同一引用的对象,则就调用该对象的run方法,所有线程均共享该target对象的资源,所以会看到线程1和线程2一共输出了51次,2条线程共同完成了i从0到49的输出,而并不像上面那样分别输出5次。至于为什么输出了51条,两条线程几乎在同一时刻进入就绪状态(start方法只是让线程进入就绪状态),观察上面的i变量不难发现当i等于0时,此时线程1和线程2均同时处于运行状态,产生了并发现象,共同输出了i=0,而此之后CPU通过不断的切换线程,使得在同一时刻只有一条线程在输出。
3.线程状态
线程分为4个状态,
就绪状态:调用start方法则进入就绪状态
运行状态:处于就绪状态的线程会被jvm进行调度从而成为运行状态
阻塞状态:如有某些同步方法未返回结果则出现阻塞状态,或sleep和yeild
死亡状态:方法体执行完毕或者强行stop某个线程
4.线程的基本操作
join()合并线程:当前线程调用某线程的join方法后将会等待某线程执行完毕后本线程才会继续。
sleep(long milliseconds)线程睡眠:阻塞当前线程,只有阻塞的时间到了才会继续下去。再阻塞的同时,会将CPU占有权交给其他线程,所以常常利用sleep(1)来切换线程
yield()线程让步:yeild类似与sleep,但是它只会让步于比自己级别高或者同级别的其他线程,若没有其他线程均比自己级别低则再次执行本线程
5.后台线程
一个程序被操作系统执行后将有一个进程,一个进程至少有一个线程(主线程),主线程并没有比其他线程有太多的特殊之处,只因为它是最早被执行的线程,在主线程中将会创建其他线程,若不指明则默认创建的是前台线程(包括main线程),若调用setDaemon(true)则显式的将该线程设置为后台线程,后台线程为Daemon线程,从名字就能看出,它的主要作用是为其他线程提供守护,服务的功能。当所有前台线程结束后,后台线程将会被强制结束,因为它此时已经没有存在的意义了。
前台线程演示:
public class ForeAndBackThread extends Thread{ public ForeAndBackThread(String name){ super(name); } public void run(){ int i; for(i=0;i<9999;i++){ System.out.println(this.getName()+"--"+i); } } public static void main(String[] args){ ForeAndBackThread th=new ForeAndBackThread("线程A"); //th.setDaemon(true); th.start(); int j; for(j=0;j<3;j++){ System.out.println(Thread.currentThread().getName()+"--"+j); } }}
程序完整的输出子线程中0到9998;说明主线程并没有什么特殊的,它的结束并不会影响其他前台线程的运行。
后台线程演示:
public class ForeAndBackThread extends Thread{ public ForeAndBackThread(String name){ super(name); } public void run(){ int i; for(i=0;i<9999;i++){ System.out.println(this.getName()+"--"+i); } } public static void main(String[] args){ ForeAndBackThread th=new ForeAndBackThread("线程A"); th.setDaemon(true); th.start(); int j; for(j=0;j<3;j++){ System.out.println(Thread.currentThread().getName()+"--"+j); } }}程序并不能完整的输出0-9998就退出了,说明前台主线程结束后,jvm强制结束了后台线程。
- java中线程的基本操作!
- Java线程的基本操作
- Java 线程的基本状态和操作
- Java中线程的操作
- 线程的基本操作
- 线程的基本操作
- 线程的基本操作
- 线程的基本操作
- 关于Java中线程的基本问题
- 线程基础:线程(3)——JAVA中的基本线程操作(中)
- 线程基础:线程(3)——JAVA中的基本线程操作(中)
- Java 中 ++ 操作符的线程安全
- Java 线程的基本概念 创建方法 和 基本操作
- Java中的多线程(一)关于线程的基本操作
- [Java多线程 二]---线程的状态与基本操作
- [Java多线程 二]---线程的状态与基本操作
- Java中File的基本操作
- Java中字符串的一些基本操作
- 给你的移动网站加点料:推荐下载App,如果本地安装则直接打开本地App(Android/IOS)
- 从零开始学WCF(7)消息协定
- 调用OPENSSL读取PEM文件的灵异问题
- [Java]读取文件方法大全
- 又开始安卓的开发了.恼火,停了等一段时间好多都淡忘了.以后记下来,不再重蹈覆辙
- java中线程的基本操作!
- 《Oracle Applications DBA 基础》 1-2 系统概要及安装
- 【PSU升级】Oracle_RAC10.2.0.1到10.2.0.5.9的详细升级过程(三)
- iOS - 国际化(多语言):
- NSDateFormatter显示格式总结
- Eclipse快捷键大全
- WPF应用程序如何重启当前的Application
- 自己动手编写web server(二)
- Html之表格在网页中的对齐_实例