线程实现方式。
并发与并行:
并发:多个任务交替执行 (一个人吃两个馒头,两个交替啃)
并行:同时执行。(n个人吃n个馒头) 速度快些。
线程与进程:
进程:进入到内存中的程序叫进程。
线程:
主线程:
执行主方法(main)的线程
单线程程序:java程序中只有一个线程,从main方法开始,从上到下依次执行。
jvm执行main方法,main方法会进入栈内存,
然后jvm找到操作系统开辟一条main方法通向cpu的执行路径,
cpu就可以通过这个路径执行main方法,这个路径叫main(主)线程。
多线程:
java程序属于抢占式调度,哪个线程高,哪个线程就优先执行,同一级别随机执行。
创建多线程程序的第一种方式:
java.lang.thread 类:是描述线程的类,想实现多线程程序,就必须继承该类。
实现步骤:
1、创建thread类的子类。
2、子类重写run方法, 来设置线程任务。
3、创建子类对象,调用start()方法,开启新的线程,执行run方法。
结果是:两个线程并发执行。
public class mythread extends thread { @override public void run() { for (int i=0;i<3;i++){ system.out.println("run->"+i); } } }
public class threaddemo { public static void main(string[] args) { mythread mythread=new mythread(); mythread.start(); for (int i=0;i<3;i++){ system.out.println("main->"+i); }
main->0
run->0
main->1
run->1
main->2
run->2 } }
多线程运行原理:
new mythread的时候,又开辟了一条通向cpu的新路径,来执行run方法。
此时,对cpu而言,就有了两条执行路径。
main线程和新线程一起抢夺cpu的执行权。
多线程内存分析:
开始执行程序时,开辟一块栈内存,main方法入栈。
此时,如果直接调用run方法的话,也是在这块栈内存执行run(),也就是仍然
是main线程程序(单线程)程序。
而如果调用的是start(),会另外开辟一块栈空间,run()入栈执行。
thread类的常用方法:
获取线程名称:
1、thread类的方法,getname();
2、获取当前正在执行的线程 static thread currentthead(),然后用getname();
第一种:
public class mythread extends thread { @override public void run() { system.out.println(getname()); } }
public static void main(string[] args) { new mythread().start(); new mythread().start(); //thread-0 // thread-1 }
第二种:
public static void main(string[] args) { system.out.println(thread.currentthread().getname()); //main } }
设置线程名称:
1、void setname(string name) 2、设置带参构造函数
sleep方法:
public static void sleep(long ...) :使当前正在执行的线程以指定毫秒暂停。
public static void main(string[] args) { for (int i=0;i<5;i++){ system.out.println(i); try { thread.sleep(1000); } catch (interruptedexception e) { e.printstacktrace(); } } }
创建多线程程序的第二种方式:
实现runnable接口:
java.lang.runnable. 实现类必须定义run的无参方法。
java.lang.thread 类的构造方法:
1、thread(runnable target) 分配新的thread对象。
2、thread(runnable target,string name)。
实现步骤:
1、创建runnable接口的实现类。
2、重写run方法,设置线程任务。
3、创建实现类的对象,用含有runnable接口的构造函数创建thread类对象。
4、用start方法,开启新线程执行run();
public class runnableclass implements runnable { @override public void run() { for (int i=0;i<5;i++){ system.out.println( thread.currentthread().getname() +"->"+i ); } } }
public static void main(string[] args) { runnableclass runnable=new runnableclass(); thread thread=new thread(runnable); thread.start(); for (int i=0;i<5;i++){ system.out.println( thread.currentthread().getname() +"->"+i ); } }
两种实现多线程方法的区别:
实现runnable接口实现多线程的好处:
1、避免单继承的局限性:
继承了thread类就不能继承其他类了,而使用接口的方式还可以继承其他类。
2、增强程序的扩展性,降低了程序的耦合性(解耦):
用实现runnable接口的方式,把设置线程任务和开启线程进行分离(解耦 )
匿名内部类实现多线程:
作用:
简化代码,把实现类实现接口,重写方法,创建实现类方法统一完成。
格式: new 父类/接口(){重写方法};
public static void main(string[] args) { new thread() { @override public void run() { for (int i=0;i<5;i++){ system.out.println(currentthread().getname()); } } }.start(); new thread(new runnable() { @override public void run() { for (int i=0;i<5;i++){ system.out.println(thread.currentthread().getname()); } } }).start(); }
上一篇: ASP.NET Core 调试本地代码
下一篇: 这家咖啡厅不错。
推荐阅读
-
thinkphp3.2.2实现生成多张缩略图的方法
-
如何为vuex实现带参数的 getter和state.commit
-
使用DevExpress的PdfViewer实现PDF打开、预览、另存为、打印(附源码下载)
-
基于DevExpress的SpreadsheetControl实现对Excel的打开、预览、保存、另存为、打印(附源码下载)
-
Vue自定义过滤器格式化数字三位加一逗号实现代码
-
vue + socket.io实现一个简易聊天室示例代码
-
JavaScript基于对象方法实现数组去重及排序操作示例
-
原生js实现可拖动的登录框效果
-
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
-
python线程的几种创建方式