java多线程的学习

1,进程和线程 

1,一个进程和另外一个进程的之间是隔离的。但是对cpu来说都是一样的。一边打游戏,一边看电影。

2,两个线程是共享着同一片资源,在同一个进程里面,例如在腾讯视频,同时打开两部电影。

3,他们的目的都是充分的利用cpu。

4,java虚拟机就是一个进程。

5,线程的实现两种方式 Runnable接口,继承Thread类。

6,在主函数psvm开启的线程,叫主线程。没有多线程的时候,就只有一个主线程。

start()只是进入执行状态,并不是立即执行,执行得看cpu心情。

1public class PrintChar implements Runnable{ 2 3 private char c; 4 private Integer times; 5 6 public PrintChar(char c, Integer times) { 7 this.c = c; 8 this.times = times; 9 } 10 11 public PrintChar() { 12 } 13 14 @Override 15 public void run() { 16 17 for(int i=0;i<times;i++){ 18 System.out.println(c); 19 } 20 } 21} 22 23public class Start { 24 25 public static void main(String[] args) { 26 Thread t1 = new Thread(new PrintChar('A',50)); 27 Thread t2 = new Thread(new PrintChar('B',50)); 28 t1.start(); 29 t2.start(); 30 } 31}

运行发现,打印A,B是交替,并不是A打印完了,再打印B

还有一种是方式是继承Thread类

1public class PrintCharOther extends Thread { 2 3 4 private char c; 5 private Integer times; 6 7 public PrintCharOther(char c, Integer times) { 8 this.c = c; 9 this.times = times; 10 } 11 12 public PrintCharOther() { 13 } 14 15 @Override 16 public void run() { 17 18 for(int i=0;i<times;i++){ 19 System.out.println(c); 20 } 21 } 22} 23 24PrintCharOther t1 = new PrintCharOther('a',100); 25 PrintCharOther t2 = new PrintCharOther('b',100); 26 t1.start(); 27 t2.start();

那么这两种方式那种好呢,java里面是多实现,单继承,一个类只能继承一个父类,一个爹,但是可以实现多个接口。

实现Runnable接口是非常灵活的。

看源码发现:

Thread类也是实现Runnable接口的。

几种线程里面的方法

1//yield() 执行这个代码的时候,让出线程,让出线程并不代表下一次不执行,可能下一次cpu还可能选中 2 //让出cpu的执行权 3 Thread.yield(); 4 5//sleep()方法是让线程睡一会儿,里面的millis是毫秒 6 if (i>=10){ 7 Thread.sleep(3000); 8 }

还有一个设置线程的interrupt()方法,这个方法相对于stop()方法来说,很文雅,

t1.interrupt();

只是改了他t1方法的的标志位,不会造成脏数据

interrupt要配合着使用,真正决定线程运行不运行还是要自己决定,这个下面的代码的意思,

当当前线程被打断了,我自己break一下,跳出去,终止不终止,由线程本身决定。

1if (Thread.currentThread().isInterrupted()){ 2 break; 3}

还有一个方法:

1if (Thread.interrupted()){ 2 System.out.println(Thread.currentThread().isInterrupted() ); 3}

intertupted()方法,这个是看看是不是interrupt我了,然后顺便清除interrupt状态。点源码进去看看

就是当当前被intertupt了,就是true,返回true,然后再设置为false,就是说顺便清除interrupt状态

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java多线程常见问题

Java多线程是什么Java提供的并发(同时、独立)处理多个任务的机制。多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级。依我的理解,Java多线程完全就是为了提高CPU的利用率。Java的线程有4种状态,新建(New)、运行(Runnable)、阻塞(Blocked)、结束(Dead),关键就在于阻塞(Bl

Python实现多进程

Python可以实现多线程,但是因为GlobalInterpreterLock(GIL),Python的多线程只能使用一个CPU内核,即一个时间只有一个线程在运行,多线程只是不同线程之间的切换,对多核CPU来说,就是巨大的浪费。如4核CPU,实际上只利用了一个核,CPU利用率只有25%。要充分利用多核CPU,可以实现Python的多进程。首先,im

4、jstack查看线程栈信息

1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6