Одна разница между реализацией Runnable и продолжением Thread заключается в том, что путем расширения Thread каждый из ваших потоков имеет уникальный объект, связанный с ним, тогда как при реализации Runnable многие потоки могут совместно использовать один и тот же экземпляр объекта.
A класс, который реализует Runnable, не является потоком и просто классом. Чтобы Runnable выполнялся потоком, вам нужно создать экземпляр Thread и передать экземпляр Runnable в качестве цели.
В большинстве случаев интерфейс Runnable должен использоваться, если вы планируете только планировать для переопределения метода run () и других методов Thread. Это важно, потому что классы не должны подклассифицироваться, если программист не намерен модифицировать или улучшать фундаментальное поведение класса.
Когда необходимо расширить суперкласс, реализация интерфейса Runnable более подходит, чем использование класс Thread. Потому что мы можем расширить другой класс, внедряя интерфейс Runnable для создания потока. Но если мы просто расширим класс Thread, мы не сможем наследовать ни от какого другого класса.
Вы также можете сделать это из командной строки:
sudo -i -u postgres
psql -At -d [dbname] -c "SELECT 'GRANT ALL ON '||viewname||' TO [username];' FROM pg_views WHERE schemaname='public';" | psql -d [dbname]
Единственный способ сделать это в одном выражении (вид) - это создать функцию, иначе вы либо будете перечислять все виды, либо предоставлять все таблицы, а затем отменять неотображения.
Я написал это быстро, но протестировал его. Вам может потребоваться настроить по необходимости:
CREATE OR REPLACE FUNCTION fn_grant_all_views(schema_name TEXT, role_name TEXT)
RETURNS VOID AS $func$
DECLARE view_name TEXT;
BEGIN
FOR view_name IN
SELECT viewname FROM pg_views WHERE schemaname = schema_name
LOOP
EXECUTE 'GRANT ALL PRIVILEGES ON ' || schema_name || '.' || view_name || ' TO ' || role_name || ';';
END LOOP;
END; $func$ LANGUAGE PLPGSQL
Использование:
SELECT fn_grant_all_views('my_schema','my_role');