Thread
1.Thread
1:子类继承Thread。
2:重写run()方法,执行run()不会开启新的线程。
3:使用start()开启一个新线程,并且执行run()。
2.多线程的内存
执行start()会开启新的线程栈区,用于执行run();
3.线程名
1:执行main方法的线程是main线程。
2:其他的线程是thread-0,thread-1。
3:String getName();
4:main线程也是Thread类的对象,可以使用static Thread currentThread()方法获取当前线程的对象,然后调用getName();
4:可以使用setName(),修改线程名,或者使用构造方法修改线程名,但是在Thread中应该添加String name参数的构造方法。
4.Thread类的方法
1:start();
2:setName(String name);
3:static void sleep(int time);可以写在任何地方。
5.Runnable
public class RunnableDemo implements Runnable {
@Override
public void run ( ) {
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( Thread . currentThread ( ) . getName ( ) + "--" + i) ;
}
}
}
public static void main ( String [ ] args) {
RunnableDemo r = new RunnableDemo ( ) ;
Thread thread = new Thread ( r, "run" ) ;
thread. start ( ) ;
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( Thread . currentThread ( ) . getName ( ) + "--" + i) ;
}
}
6.Runnable的好处
1:避免了继承的局限性。
2:采用实现接口的方式,可以达到解耦的效果,将线程对象和线程任务进行解耦。
7.多线程的匿名内部类的实现
public static void run1 ( ) {
new Thread ( ) {
@Override
public void run ( ) {
System . out. println ( "111" ) ;
}
} . start ( ) ;
Runnable runnable = new Runnable ( ) {
@Override
public void run ( ) {
System . out. println ( "222" ) ;
}
} ;
new Thread ( runnable) . start ( ) ;
new Thread ( new Runnable ( ) {
@Override
public void run ( ) {
System . out. println ( "333" ) ;
}
} ) . start ( ) ;
}
8.线程的状态图
1:NEW,新建状态,至今尚未启动的线程处于这种状态,new Thread()。
2:RUNNABLE,运行状态,正在 Java 虚拟机中执行的线程处于这种状态,执行start()。
3:BLOCKED,受阻塞并等待某个监视器锁的线程处于这种状态,阻塞与锁。
4:WAITING,无限期地等待另一个线程来执行某一特定操作的线程处于这种状态,无限等待状态,等待某一个线程的唤醒(某个线程执行notify()),如执行wait()。
5:TIMED_WAITING,等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态,等待特定的时间,如执行了sleep()。
6:TERMINATED,(terminated)死亡状态,已退出的线程处于这种状态,run()执行完或者执行shop()方法(已经过时)。
1:BLOCKED,线程具有CPU的执行资格,等待CPU资源。
2:WAITING、TIMED_WAITING,放弃CPU执行资格,唤醒后要重新抢占CPU。