(1)传统线程技术回顾
来源:互联网 发布:linux ftp设置 编辑:程序博客网 时间:2024/06/10 08:45
1,java中线程的创建可以有两种方法:1、继承Thread类 2、实现Runnable接口
两者区别:
(1)、继承Thread类创建线程的方法, 在继承了Thread类之后, 不能再继承其他的方法, (在java中支持单继承),这样灵活性就不如实现Runnable接口来创建线程的方法了;
(2)、使用实现Runnable接口来创建线程可以达到资源共享!(继承Thread类创建线程也可以实现资源共享,但是比较的麻烦。)
在我们创建线程的时候都会优先采用实现Runnable接口的方法。
package com.thread;public class TestThread2 {/** * @param args */public static void main(String[] args) {Runner r = new Runner();r.start();for(int i=0; i<100; i++) {System.out.println("Main Thread:------" + i);}}}class Runner extends Thread {public void run() {for(int i=0; i<100; i++) {System.out.println("Runner1 :" + i);}}}
package com.thread;public class TestThread3 {/** 优先考虑的方式。 * @param args */public static void main(String[] args) {Runner2 r = new Runner2();Thread t1 = new Thread(r);Thread t2 = new Thread(r);t1.start();t2.start();}}class Runner2 implements Runnable{@Overridepublic void run() {for(int i=0;i<30;i++){System.out.println("No:" + i);}}}
package com.itm.thread;public class TraditionalThread {/** * @param args */public static void main(String[] args) {Thread thread = new Thread() {@Overridepublic void run() {while(true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("1 " + Thread.currentThread().getName());System.out.println("2 " + this.getName());}}};thread.start();Thread thread2 = new Thread(new Runnable(){@Overridepublic void run() {while(true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("1 " + Thread.currentThread().getName());// this 就不代表线程了。因为在 Runnable 对象里面。//System.out.println("2" + this.getName());}}});thread2.start();/******************************************************************************** * * 注释源码说明:利用了 面向对象的 覆盖技术。 * * * 调用 start()方法,start()方法 会找 当前对象的run()方法 * (1) 如果自己没有 就找父类中的run()方法。 * 父类的run()方法 会找 Runnable。 * (2) 如果 自己有 run()方法,就把 父类的覆盖了。 * * */new Thread(new Runnable() {@Overridepublic void run() {while(true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Runnable :" + Thread.currentThread().getName());}}}){public void run() {while(true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread : " + Thread.currentThread().getName());}};}.start();}}
关于 上面注释源码的:
(1):public void run() {if (target != null) { // 如果 target不是为空 就会执行 Runnable的run(); 因为:target是 Runnable的 一个变量。 target.run();}}(2) : /* What will be run. */ private Runnable target;------------------------------------------------------------------------------------------------------ /** * Initializes a Thread. * * @param g the Thread group * @param target the object whose run() method gets called * @param name the name of the new Thread * @param stackSize the desired stack size for the new thread, or * zero to indicate that this parameter is to be ignored. */ private void init(ThreadGroup g, Runnable target, String name, long stackSize) {Thread parent = currentThread();SecurityManager security = System.getSecurityManager();if (g == null) { /* Determine if it's an applet or not */ /* If there is a security manager, ask the security manager what to do. */ if (security != null) {g = security.getThreadGroup(); } /* If the security doesn't have a strong opinion of the matter use the parent thread group. */ if (g == null) {g = parent.getThreadGroup(); }}/* checkAccess regardless of whether or not threadgroup is explicitly passed in. */g.checkAccess();/* * Do we have the required permissions? */if (security != null) { if (isCCLOverridden(getClass())) { security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION); }} g.addUnstarted();this.group = g;this.daemon = parent.isDaemon();this.priority = parent.getPriority();this.name = name.toCharArray();if (security == null || isCCLOverridden(parent.getClass())) this.contextClassLoader = parent.getContextClassLoader();else this.contextClassLoader = parent.contextClassLoader;this.inheritedAccessControlContext = AccessController.getContext();this.target = target;setPriority(priority); if (parent.inheritableThreadLocals != null) this.inheritableThreadLocals =ThreadLocal.createInheritedMap(parent.inheritableThreadLocals); /* Stash the specified stack size in case the VM cares */ this.stackSize = stackSize; /* Set thread ID */ tid = nextThreadID(); } public void run() {if (target != null) { target.run();} }
- (1)传统线程技术回顾
- (1)传统线程技术回顾
- 传统线程技术回顾
- 传统线程技术回顾
- 传统线程技术回顾
- 传统的线程技术回顾
- Java并发库(一):传统线程技术回顾
- 传统定时器技术回顾
- 【Java多线程与并发库】1.传统线程技术回顾
- 【Java多线程与并发库】1.传统线程技术回顾
- 01_张孝祥_Java多线程_传统线程技术回顾
- JUC线程-传统线程回顾
- 传统线程技术(一)
- 一、传统线程的回顾
- 传统的定时器技术回顾
- 【张孝祥并发课程笔记】01:传统线程技术和定时器技术回顾
- 传统线程互斥技术(传统的sychronized)
- Java并发库(二):传统定时器技术回顾
- Android4.0上 : 关于you cannot combine custom titles with other title features 错误
- GCC、ARM-LINUX-GCC、ARM-ELF-GCC浅析
- STL 监视窗口数据查看
- Linux pid_t (Linux 下进程标识号)
- 结构体中四字节对齐的详解
- (1)传统线程技术回顾
- 使用sql developer 导出Oracle数据库中的表结构
- 使用构造函数
- 单字节字符串, 双字节字符串, 二进制字符串
- 26 架构里没有大写的“I”
- Perl 最佳实践(节选) --- 09
- C# RichTextBox行高自适应
- rubycas-server
- 在activitygroup中用startActivityForResult