程序(program)是一段静态的代码。
进程是正在运行的一个程序,是动态的,进程有它自己的产生,存在和消亡过程。、
线程的创建,继承Thread类
上图说的很明白了吧,咱再给你演示一下
1.做好准备工作,把我们自己创建的分线程是要做啥的,给写到run()方法里。
2.在主线程,main方法里创建分线程并让分线程运行起来
至此,完结散花。
start()方法是做啥的呢?启动当前线程(谁调这个方法谁就是当前线程),并自动调用当前线程的run()方法。
那么问题来了,可不可以直接调用run()?肯定不可以。那我要是就调了,会咋样
t1.run();//没有开启新的线程,只是单纯的对象调用方法
那我这个线程启动了之后,我再调start()方法,还是那个t1,可以吗,不可以。不能让已经start()的线程去再启动。你可以去new 一个新的t2,用t2.start()
t1.start(); t1.start(); //用t1调用俩次start(),会报异常
接着我们可以使用匿名内部类的方式,优化一下上面的代码.
不得不说,人类越来越会玩了,看着确实优雅太多了
有了线程,也开启了,接这看看常用的一些方法,大饱眼福
先来不是那么难理解的:
再来一点稍微有水平的
你会发现这些方法使让线程更加灵活了,让我们能更好的去理解这个线程,去控制它了。
线程的调度,人性化设计。凡是人性化设计的那就是很合理的,很容易共鸣。
看到这个时间片,想到了我大学学的知识,在这里看到了熟悉的方波。同优先级就乖乖排队,高优先级的会具有更高的概率获得cpu执行权。
再赐予你一件法宝图:
比方说,下面这样的 把分线程优先级设置到最高,主线程优先级设置到最低。
对线程有了初步的概念后,我们还有一种更好的方式去创建线程,我们上面是继承Thread类。
这第二种方式就是实现Runnable接口
准备工作: 创建一个类实现Runnable接口
在主线程main方法里;注意线程t1是怎么来的。
Thread t1=new Thread(mThread)//把实现类的对象作为参数传入Thread构造器
那么,实现Runnable接口的方式好在哪里了?
因为java单继承的限制,继承了Thread类,就没有办法继承别的类了。
而且用实现Runnable接口的方式更适合处理多个线程有共享数据的情况,用它就完事。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)