匿名内部类:创建匿名内部类时必须同时创建匿名内部类对象否则以后将不能创建匿名内部类对象
public class innerClass
{
public static void main(String[] args)
{
NeiFather nf=new NeiFather()//创建匿名内部类时必须同时创建匿名内部类对象
{//匿名内部类中可以重写父类中的方法也可以定义自己的方法
@Override
public void myVoid() {
System.out.println("匿名内部类的方法");
}
};
nf.myVoid();
}
}
class NeiFather//匿名内部类将继承的父类,也可通过接口实现
{
public void myVoid()
{
System.out.println("method of NeiFather");
}
}
匿名内部类对象初始化:创建一个非静态语句块
public class innerClass
{
public static void main(String[] args)
{
NeiFather nf=new NeiFather()
{
{
i=66;
}
public void myVoid() {
System.out.println(i);
}
};
nf.myVoid();
}
}
class NeiFather
{
int i;
public void myVoid()
{
System.out.println("method of NeiFather");
}
}
综合练习tips:局部内部类中,只能访问方法中的final变量
多线程:
定义线程有两种方法:继承Thread类、实现Runnable接口
重写run方法中定义该线程要执行的语句、创建线程对象、调用线程对象的start方法
package com.test;
class myRunnable implements Runnable//或extends Thread
{
@Override
public void run() {
System.out.println("right way to start threads");
}
}
public class thre {
public static void main(String[] args)
{
myRunnable mr=new myRunnable();
Thread t=new Thread(mr);//create thread object
t.start();
}
}
线程只能被启动一次,多次start会发生异常
同时运行多个线程:
package com.test;
class myRunnable implements Runnable//或extends Thread
{
@Override
public void run() {
for(int i=0;i<100;i++)
System.out.print("#");
}
}
class myThread extends Thread
{
@Override
public void run() {
for(int i=0;i<100;i++)
System.out.print("@");
}
}
public class thre {
public static void main(String[] args)
{
myRunnable mr=new myRunnable();
myThread mt=new myThread();
Thread tt=new Thread(mt);
Thread t=new Thread(mr);//create thread object
t.start();
tt.start();
}
}
运行结果:
@@@@@@@@@@@@@####################################################################################################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Process finished with exit code 0
线程的生命周期分为 五种不同的状态:新建状态(new Thread()开辟了内存空间和初始化数据)、准备状态(调用start后(具有执行资格但不具有执行权限))、运行状态(获取了cpu资源)、等待/阻塞状态(接触后不会立刻回到运行状态、而是进入准备状态)、死亡状态(run方法结束或发生异常终止运行)
线程的调度:
睡眠方法:sleep():可能发生捕获异常的,必须进行异常处理
class myThread extends Thread
{
@Override
public void run() {
for(int i=0;i<100;i++)
{
System.out.print("@");
try
{
Thread.sleep(20);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
线程优先级:setPriority():1-10、优先级常量:MAX_PRIORITY,NORM_PRIORITY,MIN_PRIORITY
tt.setPriority(Thread.MIN_PRIORITY);
t.setPriority(Thread.MAX_PRIORITY);
yield让步方法:使线程回到准备状态(但系统可能再次选择该进程,让步操作可能不成功)
class myThread implements Runnable
{
@Override
public void run() {
for(int i=0;i<100;i++)
{
System.out.print("@");
Thread.yield();
}
}
}
join让步方法:将当前线程的cpu资源让步给指定的线程(等另一个线程执行完毕才可以恢复):join([指定时间内让步])
public class thre {
public static void main(String[] args)
{
myRunnable mr=new myRunnable();
//myThread mt=new myThread();
//Thread tt=new Thread(mt);
Thread t=new Thread(mr);//create thread object
//tt.setPriority(10);//@
t.setPriority(Thread.NORM_PRIORITY);
t.start();
for(int i=0;i<100;i++)
{
if (i==20)
{
try
{
t.join();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
System.out.print("%");
}
//tt.start();
}
}
运行结果:
%%%%%%%%%%%%%%%%%%%%####################################################################################################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Process finished with exit code 0