Получение факториала с помощью Runnable и Callable
publicclassMain{publicstaticvoidmain(String[] args){ExecutorService factorial =Executors.newSingleThreadExecutor();TestFactorial testFactorial =newTestFactorial(5);
factorial.execute(testFactorial);
factorial.shutdown();}}classTestFactorialimplementsRunnable{int a;publicTestFactorial(int a){this.a = a;}@Overridepublicvoidrun(){if(a ==0){System.out.println("Error entered zero");return;}int c =1;for(int i =1; i <= a; i++){
c *= i;}System.out.println(c);}}
publicclassMain{publicstaticvoidmain(String[] args)throwsExecutionException,InterruptedException{ExecutorService factorial =Executors.newSingleThreadExecutor();TestFactorial testFactorial =newTestFactorial(5);Future<Integer> future = factorial.submit(testFactorial);// данный метод также как и execute добавляет наш task в ThreadPool, но ещё и возвращает// результат нашего таска. Этот результат содержаится в объекте типа FutureInteger x = future.get();System.out.println(x);}}classTestFactorialimplementsCallable{int a;publicTestFactorial(int a){this.a = a;}@OverridepublicIntegercall()throwsException{if(a ==0){thrownewException("Error entered zero");}int c =1;for(int i =1; i <= a; i++){
c *= i;}return c;}}
publicclassMain{publicstaticvoidmain(String[] args)throwsInterruptedException{ExecutorService test =Executors.newFixedThreadPool(3);// создаем ThreadPool c 3-мя потокамиfor(int i =0; i <10; i++){
test.execute(newThreadPoolTest());// передаем объект который имплементирует Runnable}}}classThreadPoolTestextendsThread{@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName());}}
pool-1-thread-1
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-3
pool-1-thread-3
pool-1-thread-1
pool-1-thread-2
publicclassMain{publicstaticvoidmain(String[] args)throwsInterruptedException{UserThread userThread =newUserThread();
userThread.start();Thread.sleep(2);
userThread.interrupt();// поток main хочет прервать поток UserThread
userThread.join();System.out.println("end");}}classUserThreadextendsThread{@Overridepublicvoidrun(){for(int i =0; i <1000000000; i++){if(isInterrupted()){// проверка на прерывание потокаSystem.out.println("UserThread exit");return;}System.out.print(i);System.out.print(" ");}}}01234567891011121314151617181920212223UserThread exit
end
publicclassMain{publicstaticvoidmain(String[] args){Lock test =newReentrantLock();Driver driver1 =newDriver("Tom", test);Driver driver2 =newDriver("Jerry", test);Driver driver3 =newDriver("Elton", test);Driver driver4 =newDriver("Marry", test);}}classDriverextendsThread{String name;privateLock lock;Driver(String name,Lock lock){this.name = name;this.lock = lock;this.start();}publicvoidrun(){System.out.println("Mr(s) "+ name +" waiting");
lock.lock();System.out.println("Mr(s) "+ name +" uses a gas station");
lock.unlock();System.out.println("Mr(s) "+ name +" finished the job");}}Mr(s)Tom waiting
Mr(s)Jerry waiting
Mr(s)Elton waiting
Mr(s)Marry waiting
Mr(s)Tomusesa gas station
Mr(s)Jerryusesa gas station
Mr(s)Eltonusesa gas station
Mr(s)Marryusesa gas station
Mr(s)Marry finished the job
Mr(s)Jerry finished the job
Mr(s)Tom finished the job
Mr(s)Elton finished the job
Реализуйте метод, позволяющий другим методам узнать, откуда их вызвали.
Метод getCallerClassAndMethodName() должен возвращать имя класса и метода, откуда вызван метод, вызвавший данный утилитный метод. Или null (нулевую ссылку, а не строку "null"), если метод, вызвавший getCallerClassAndMethodName() является точкой входа в программу, т.е. его никто не вызывал.
publicstaticStringgetCallerClassAndMethodName(){StackTraceElement[] x =Thread.currentThread().getStackTrace();if(x.length >3){return x[3].getClassName()+"#"+ x[3].getMethodName();}else{returnnull;}}
Напишите статический класс AsciiCharSequence, реализующий компактное хранение последовательности ASCII-символов (их коды влезают в один байт) в массиве байт. По сравнению с классом String из Java 8, хранящим каждый символ как char, AsciiCharSequence будет занимать в два раза меньше памяти
Класс AsciiCharSequence должен:
реализовывать интерфейс java.lang.CharSequence;
иметь конструктор, принимающий массив байт;
определять методы length(), charAt(), subSequence() и toString()
Сигнатуры методов и ожидания по их поведению смотрите в описании интерфейса java.lang.CharSequence (JavaDoc или исходники).
importjava.util.Arrays;publicclassMain{publicstaticvoidmain(String[] args){byte[] example ={72,101,108,108,111,33};AsciiCharSequence answer =newAsciiCharSequence(example);System.out.println("Последовательность - "+ answer.toString());//Hello!System.out.println("Размер её - "+ answer.length());//6System.out.println("Символ под № 1 - "+ answer.charAt(1));//eSystem.out.println("Подпоследовательность - "+ answer.subSequence(1,5));//ello}publicstaticclassAsciiCharSequenceimplementsCharSequence{privatebyte[] test;publicAsciiCharSequence(byte[] test){this.test = test;}publicintlength(){return test.length;}publiccharcharAt(int index){return(char) test [index];}publicCharSequencesubSequence(int start,int end){returnnewAsciiCharSequence(Arrays.copyOfRange(test, start, end));}publicString toString (){returnnewString(test);}}}
Давайте представим, что у нас есть студенты, описанные данным классом:
public static class Student {
protected final String studying;
protected Student(String work) {
this.studying = work;
}
public Student() {
this.studying = "Прохожу тестовое задание.";
}
public void study() {
System.out.println("Я очень занят. " + studying);
}
}
деятельность которых ограничена учением. Как ты мог заметить этот класс описывает еще не поступившего на конкретное направление студента.
Создай на его основе класс JavaStudent, который будет учиться на направлении Java.
Требования:
1. класс JavaStudent должен быть public static
2. класс JavaStudent должен быть наследников Student.
3. класс JavaStudent должен иметь только один публичный контруктор - конструктор без параметров.
4. класс JavaStudent не должен иметь новых методов или переопределять существующие.
5. Метод study() вызванный у объектов JavaStudent должен выводить в консоль сообщение "Я очень занят. Прохожу курс по Java."
publicstaticclassJavaStudentextendsStudent{publicJavaStudent(){super("Прохожу курс по Java.");}}
Реализуй три метода:
1. boolean isWeekend(String dayName) - метод принимает строку и отвечает, является ли данная строка выходным днем. Выходным днем являются Sunday и Saturday.
2. int weekendCount(String[] days) - метод принимает массив строк и возвращает количество выходных дней в этом массиве.
3. int weekdayCount(String[] days) - метод принимает массив строк и возвращает количество будних дней в этом массиве.
publicstaticbooleanisWeekend(String dayName){if(dayName =="Saturday"|| dayName =="Sunday"){returntrue;}else{returnfalse;}}publicstaticintweekendCount(String[] days){int counter =0;for(int i =0; i < days.length; i++){if(isWeekend(days[i])==true){
counter++;}}return counter;}publicstaticintweekdayCount(String[] days){return days.length -weekendCount(days);}
Дан класс ComplexNumber. Переопределите в нем методы equals() и hashCode() так, чтобы equals() сравнивал экземпляры ComplexNumber по содержимому полей re и im, а hashCode() был бы согласованным с реализацией equals().
Реализация hashCode(), возвращающая константу или не учитывающая дробную часть re и im, засчитана не будет
public static class ComplexNumber {
private double re;
private double im;
public ComplexNumber() {
}
public ComplexNumber(double re, double im) {
this.re = re;
this.im = im;
}
public double getRe() {
return re;
}
public double getIm() {
return im;
}
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj.getClass() != this.getClass()) {
return false;
}
ComplexNumber x = (ComplexNumber) obj;
return re == x.re && im == x.im;
}
@Override
public int hashCode() {
int result;
long temp;
temp = Double.doubleToLongBits(re);
result = (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(im);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
}
На игровом поле находится робот. Позиция робота на поле описывается двумя целочисленным координатами: X и Y. Ось X смотрит слева направо, ось Y - снизу вверх. (Помните, как рисовали графики функций в школе?)
В начальный момент робот находится в некоторой позиции на поле. Также известно, куда робот смотрит: вверх, вниз, направо или налево. Ваша задача — привести робота в заданную точку игрового поля.
↓↓↓↓↓