多线程这个名词在计算机理论和软件开发中经常用到,而且在java面向对象程序设计中经常将多线程编程作为高级编程部分,多线程都放到了高级部分,恐怕在校计算机专业的大学生就要悲剧了,要知道很多时候我们将要面对一个知识领域的入门槛的时候,大概也就考试到了,画个重点,勾几个题,刷刷,一本书就噢啦。此情此景相比很多童鞋和我都有相同的感受。
怎么解释线程是很没有必要的。。百度百科这样。总之我们想一次控制多个任务。
其实说起线程,讲一个不雅的示例,人在大号的时候,通过都是大号+小号同时进行;就上厕所这件事而言是一个进程,而大号则是开启一个线程处理大号的事务,而小号同时开启一个线程处理小号的事务,互不干涉,当大号和小号都结束时,此时上厕所结束,进程也就结束了。
还有很多生活中的例子,去饭店吃饭,一个饭店能够在尽量短的时间内为多个客人呈上各式各样的所点的菜,这在他们的后厨和餐厅服务中伴随这不知多少错综复杂的线程关系啊!
很多时候我们都忽略了学习线程的意义,或者在开发中没能融入生活。说到这想起国美的一个广告:“国美电器,生活又大美”。道理就是这个样子。
下面写了几个线程的代码块:
1.在方法中创建一个线程对象,重新线程的run()方法
- Thread thread1=new Thread(){
- @Override
- public void run() {
- while(true){
- try {
- Thread.sleep(500);
- System.out.println("<Runable-1>\t"+Thread.currentThread().getName());
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- };
- thread1.start();
在Thread类中的run()方法查看源代码如下:
- public void run() {
- if (target != null) {
- target.run();
- }
- }
在上面的Thread1对象中我们重新了run()方法。
2.继续查看源代码,Thread类中的init()方法
线程对象一旦创建首先在构造方法中调用了init()方法
- public Thread() {
- init(null, null, "Thread-" + nextThreadNum(), 0);
- }
- private void init(ThreadGroup g, Runnable target, String name,
- long stackSize)
上面可以看到init()方法是私有的。继续查看,initl()方法的调用
从init()方法的参数和上图就可以看到在创建Thread对象的时候可以传递Runnable对象,而Runnable又是一个接口,这样以来我们就可以根据实际需要来创建实习Runnable接口的类。
下面是Runnable接口源代码:
- public
- interface Runnable {
- /**
- * When an object implementing interface <code>Runnable</code> is used
- * to create a thread, starting the thread causes the object's
- * <code>run</code> method to be called in that separately executing
- * thread.
- * <p>
- * The general contract of the method <code>run</code> is that it may
- * take any action whatsoever.
- *
- * @see java.lang.Thread#run()
- */
- public abstract void run();
- }
很显然我们只需要实习run()方法就可以了。
- Thread thread3=new Thread(new Runnable(){
- @Override
- public void run() {
- while(true){
- try {
- Thread.sleep(500);
- System.out.println("<Runable-3>\t"+Thread.currentThread().getName());
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }, "Thread3");
- thread3.start();
这样的写法应该是符合面向对象编程的思想,做到了封装性,内部类作为参数
3.为了更为灵活,具体优势很多参见:
首先编写一个类实现Runnable接口:
- public class SonThread implements Runnable{
- @Override
- public void run() {
- while(true){
- try {
- Thread.sleep(500);
- System.out.println("<Runable-2>\t"+Thread.currentThread().getName());
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
然后在使用SonTread类的对象作为Thread类的构造方法的参数,并且在SonThread类中对run()方法实习。
- SonThread st=new SonThread();
- Thread thread2=new Thread(st, "<Runable-2>\t");
- thread2.start();
线程的基本创建就这么些,其他都是在这个基础上增加和加强,当然使用多线程往往会伴随这加锁机制,资源共享等方面的编程。